Как заставить поток ждать?
Есть несколько потоков, выполняющих функцию рисования линий из символов, и нужно заставить один поток ждать, пока дорисует другой/несколько других, при этом не прибегая к WaitForSingleObject. =>(0,1),3,2,4 | 4,(2,3),(1,0)<= в таком порядке они должны двигаться, однако как это реализовать понятия не имею.
#include <windows.h>
#include <iostream>
using namespace std;
HANDLE hConsole;
CRITICAL_SECTION cs;
COORD pos;
//Рисование
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;
bool iOnRight;
bool iOnLeft;
CylParams() {
iOnRight = false;
iOnLeft = false;
};
};
//Ход цилиндра
DWORD WINAPI f0(PVOID param) {
CylParams* p = (CylParams*)param;
int row = p->row;
while (1) {
if (p->iOnLeft) {
for (int x0 = X_MIN; x0 < X_MAX; x0++) {
draw(x0, row, '#');
Sleep(p->delay);
}
p->iOnRight = true;
}
if (p->iOnRight) {
for (int x0 = X_MAX; x0 > X_MIN; x0--) {
draw(x0, row, ' ');
Sleep(p->delay);
}
p->iOnLeft = true;
}
}
//return 0;
}
int main() {
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
InitializeCriticalSection(&cs);
//=>(0,1),3,2,4 | 4,(2,3),(1,0)<=
CylParams params[5];
for (int i = 0; i < 5; i++) {
params[i].row = 3 + i * 2;
params[i].delay = 30 + i * 30;
CreateThread(NULL, 0, f0, params + i, 0, NULL);
}
params[0].iOnLeft = true;
params[1].iOnLeft = true;
system("pause > 0");
return 0;
}