> Все бы было так, если бы 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.
если у тебя цель чтобы 50 потоков делали какую то операцию
неодновременно, просто напиши так, при этом Event у тебя AutoReset
SetEvent(AllowItEvent);
for(i=0; i<50; i++)
{
HANDLE hThread = CreateThread(0, 0, ThreadProc, 0, 0, &ThreadID);
CloseHandle(hThread);
Sleep(0); // - не обязательно конечно,
// просто передадим управление вновь созданному потоку
}
DWORD CALLBACK ThreadProc(void *dummy)
{
WaitForSingleObject(AllowItEvent, INFINITE);
DoItHere();
SetEvent(AllowItEvent);
return(0);
}
---
а то получается, что ты вместо 50 потоков создаешь 100 и до фига лишних действий. не мудрено что тормозит.
уверен так будет работать на много быстрее. и конечно не забудь, что для данного примера
Event AllowItEvent создан как AutoReset, а не ManualReset.
|