> > DWORD CALLBACK AllowPingHolderThread(void *dummy) > > { > > Sleep(df.PingDelay); > > SetEvent(AllowPingEvent); > > > > return(0); > > } > > > > и следующий не начнется без AllowPingEvent, а он > тормозит > > мля :((( > > > из твоего сказанного выходит, что пока не сработает > SetEvent(AllowPingEvent); поток не создастся. > теперь следи что у тебя получается : > 1) Зашел в AllowPingHolderThreadж > 2) передал управление другому потоку; тот что то сделал, > или ничего не сделал если нет потока, это не важно, главное > тут твой поток немного тормознул уже. > 3) поставил Event в состояние Signaled. > 4) вышел из ф-ии и продолжил работу, так и не передав сразу > же управление другому потоку - ждущему или вновь > создающемуся, т.е. у тебя торомозит дважды (1-ый раз в п.2) > > попробуй так, думаю тебя удовлетворит (просто поменяй > местами строки) > > DWORD CALLBACK AllowPingHolderThread(void *dummy) > { > SetEvent(AllowPingEvent); // <<== > Sleep(df.PingDelay); // <<== > > return(0); > } >
Все бы было так, если бы AllowPingHolderThread сам бы не был потоком.
Допустим, я создаю сразу 50 одинаковых потоков, и хочу чтобы они выполняли какую-то операцию не одновременно:
for(i=0; i<50; i++) CreateThread(0, 0, ThreadProc, 0, 0, &ThreadID);
DWORD CALLBACK ThreadProc(void *dummy)
{
WaitForSingleObject(AllowItEvent, INFINITE);
CreateThread(0, 0, DelayThreadProc, 0, 0, &ThreadID);
DoItHere();
return(0);
}
DWORD CALLBACK DelayThreadProc(void *dummy)
{
Sleep(Delay);
SetEvent(AllowItEvent);
return(0);
}
---
Можно вообще не пользовать событие, а дожидаться окончания DelayThreadProc.
|