PDA

View Full Version : WaitForMultipleObjects


Zelig
01-10-2004, 20:11
ciao mi potete dare una mano,
sto provando ad usare la "WaitForMultipleObjects" per attendere
l'evento di scrittura su di un socket

faccio cosi ma la WaitForMultipleObjects nonsi ferma e cicla sempre

//array di handle dell'evento
HANDLE hnd_eventsck[2];

//creo gli eventi
hnd_eventsck[0] = WSACreateEvent();
hnd_eventsck[1] = CreateEvent(NULL,true,false,NULL);

//associo a questo evento la scrittura sul socket
WSAEventSelect(s_client,hnd_eventsck[0],FD_WRITE);

while(true){

//attendo che si verifichi un evento
switch (WaitForMultipleObjects(2, hnd_eventsck, FALSE, INFINITE)){
case WAIT_OBJECT_0:
//evento 1
break;
case WAIT_OBJECT_0+1:
//evento 2
break;
}

}


ciao zelig

cionci
01-10-2004, 20:45
Come mai usi 2 eventi ?

Poi perchè non usi WSAWaitForMultipleEvents ?

Zelig
01-10-2004, 22:51
ciao
ne uso due perchè un altro mi serve in seguito
da richiamare com PulseEvent(), ma non l'ho ancora implementato

ho gia provato la WSAWaitForMultipleEvents , ma non si ferma ugualmente

cionci
02-10-2004, 00:11
Definisci gli eventi separati...
Uno usalo con WSAWait... e l'atro con Wait...

Zelig
02-10-2004, 00:28
ma poi dovrei usare il WaitForSingleObject?

ma poi un non bloccherebbe l'esecuzione dell'altro?

mi faresti un esempio?

cionci
02-10-2004, 00:39
Fammi capire ma per te o l'uno o l'altro evento vanno bene comunque ?

Non hai una sequenza in cui si verificano ?

Altra cosa, non puoi usare la select per verificare l'arrivo di dati e fare un WaitForSingleObject con un timer finito sull'altro evento ?

Sinceramente non ho mai usato i WSAEvent, ma ho sempre usato la programmazione socket standard con la select per effettuare recv non bloccanti...

Zelig
02-10-2004, 01:12
prefrivo non usare la select

poi non c'è una sequenza fissa in cui si possono verificare i due eventi.

praticamente io ho un server in ascolto

questo server aprirà un thread per ogni client che si collega
ed in questo threads devo gestire i due eventi

uno sarebbe proprio la scrittura del socket e volevo usare il Waitevent in modo da non rendere bloccante la recv

poi l'altro evento dovrebbe scatenarsi all'esterno di questo thread quando si verifica una certa condizione e richiamo la
PulseEvent(id secondo evento)

farò qualche alta prova

grazie

cionci
02-10-2004, 01:22
Il problema è che non credo che un evento realtivo ai socket possa essere usato con WaitForMultipleObject (nella documentazione questo uso non è presente)...
Potresti usare WSAEventSelect al posto della select...

Zelig
02-10-2004, 01:27
ma come puoi vedere nell'esempio del primo post uso gia
WSAEventSelect per creare l'evento

forse per i socket è meglio usare WSAWaitFomultipleEvents al posto di
WaitForMultipleObjects ?

cionci
02-10-2004, 01:54
Ma il problema è sempre lo stesso...non puoi controllare entrambi gli eventi insieme...

Zelig
02-10-2004, 15:16
facendo alcune prove adesso la WSAWaitForMultipleEvents sembra funzionare solo se si scatenano entrambi gli eventi,
anche avendo specificato come terzo parametro FALSE
(questo paramtetro è quello con cui si specifica se aspettare che tutti gli eventi si verificano).
io ho specificato apposta FALSE perchè basta aspettare che uno degli eventi si verifichi, ed invece non sembra comportarsi così?

idee? suggerimenti?

grazie

Zelig
04-10-2004, 17:24
risolto

ho usato la WaitForMultipleObject e funziona benissimo

grazie