PDA

View Full Version : WaitForSingleObject


Zelig
03-10-2003, 15:31
Ciao ragazzi,
volevo chiedervi se potevate darmi un aiuto con questa API.
Vi descrivo brevemente quelo che faccio io e cosa mi è capitato:

Ad un dato evento creo un thread in questo modo:


WaitForSingleObject(run_job,INFINITE);

//creo il thread
DWORD ID;
run_job = CreateThread(0,0,run_job_time,gs_record,0,&ID);

la prima volta arrivato al "WaitForSingleObject" vede che l'Handle del thread è null e quindi crea e lancia il thread.

Però può capitare anzi è molto probabile che capiti che il programma debba creare altri threads ma deve aspettare che sia finito quello precedente (lo stesso), e qui mi capita che alla seconda volta che controlla "WaitForSingleObject" il se siè verificato per esempio 3 volte l'evento che deve generare il tread, appena il primo e terminato mi lancia uno di seguito all'altro i due thread rimanenti invece di lanciare uno e ed aspettare che sia finito per poi lanciare l'altro.

Sapreste dirmi perchè?
Spero di essere stato abbastanza chiaro.

Ciao Zelig

cionci
04-10-2003, 08:02
A parte che WaitForSingleObject(run_job,INFINITE); è un po' bruttino visto che blocca tutta l'interfaccia della tua applicazione mentre è in attesa.... Io fare un WaitForSingleObject(run_job, 1); e poi con un timer (mettiamo ogni 300 millisecondi) chiamerei questa routine:


void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
static int count = 0;
static HANDLE run_job = NULL;
DWORD res = WAIT_OBJECT_0;

if(run_job != NULL) res = WaitForSingleObject(run_job, 1);

if(count == 3 && res == WAIT_OBJECT_0)
{
KillTimer(hwnd, idEvent);
return;
}

if(res == WAIT_OBJECT_0)
{
DWORD ID;
run_job = CreateThread(0, 0, run_job_time, gs_record, 0, &ID);
++count;
}
}