Применение WaitForSingleObject/WaitForMultipleObjects

Есть код, рисующий в консоли три ряда символов '#', после чего ряды убывают назад. Нужно с использованием WaitForSingleObject/WaitForMultipleObjects добиться того, что ряды будут двигаться вперёд в последовательности 1,3,2, назад - (2,3)(одновременно),1. Только пришёл к этой теме и совсем не понимаю как и что делать, буду благодарен за любую помощь.

#include <windows.h>
#include <iostream>
using namespace std;

HANDLE hConsole;
CRITICAL_SECTION cs;

COORD pos;

// =>1,3,2 | <=(2,3),1

void draw(int x, int y, char symbol) {
    EnterCriticalSection(&cs);
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hConsole, pos);
    cout << symbol;
    LeaveCriticalSection(&cs);
}

#define X_MIN 20
#define X_MAX 40

class CylParams {
public:

    int row;
    int delay;

    HANDLE iOnRight;
    HANDLE iOnLeft;

};

DWORD WINAPI f0(PVOID param) {
    
    CylParams* p = (CylParams *)param;

    int row = p->row;
    while (INFINITE) {
        //eWaitRight
        for (int x0 = X_MIN; x0 < X_MAX; x0++) {
            draw(x0, row, '#');
            Sleep(p->delay);
        }
        SetEvent(p->iOnLeft);

        //eWaitLeft
        for (int x0 = X_MAX; x0 > X_MIN; x0--) {
            draw(x0, row, ' ');
            Sleep(p->delay);
        }
        SetEvent(p->iOnRight);
    }
}

int main() {
    
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    InitializeCriticalSection(&cs);

    CylParams params[3];
    for (int i = 0; i < 3; i++) {
        params[i].row = 3 + i * 2;
        params[i].delay = 30 + i * 30;

        params[i].iOnLeft = CreateEvent(NULL, false, false, NULL);
        params[i].iOnRight = CreateEvent(NULL, false, false, NULL);
    }

    for (int i = 0; i < 3; i++) {
        CreateThread(NULL, 0, f0, params + i, 0, NULL);
    }

    system("pause > 0");
    return 0;
}

Ответы (0 шт):