Newsgroup: it.comp.programmare.win32
Titolo: Terminare un thread che esegue chiamata bloccante

>TerminateThread)? 
Chiudergli la socket che sta usando, cosi' la recvfrom va in errore.
-- 
a n t o n i o
www.geminisoft.com

>connessione, per questo volevo evitarlo...
Non fare la recv se non ci sono dati da leggere; con le socket puoi sapere
se ci sono dati da leggere attraverso la ioctlsocket, una cosa tipo:
	ioctlsocket(m_Socket, FIONREAD, &value)
Quindi nel tuo thread dei fare un ciclo e leggere solo se ci sono dati;
metti una Sleep() per prendere troppa cpu. Inoltre in questo ciclo devi
poter essere interrotto dal processo chiamante attraverso un flag messo da
qualche parte.


>>>>> "a" == aWARe  <aW...@puff.uff> writes:
a> che non sembra gradire una tal terminazione del thread...
Non è lei. E' Windows.
a> e quindi posso chiamare in freschezza TerminateThread? 
La TerminateThread()  e la TerminateProcess()  non si chiamano  mai in
freschezza sotto Windows:
TerminateThread is used to cause a thread to exit. When this occurs,
the target thread has no chance to execute any user-mode code and its
initial stack is not deallocated. DLLs attached to the thread are not
notified that the thread is terminating.
TerminateThread is a dangerous function that should only be used in
the most extreme cases. You should call TerminateThread only if you
know exactly what the target thread is doing, and you control all of
the code that the target thread could possibly be running at the time
of the termination. For example, TerminateThread can result in the
following problems:
·	If the target thread owns a critical section, the critical
	section will not be released.  
·	If the target thread is executing certain kernel32 calls when
	it is terminated, the kernel32 state for the thread's process
	could be inconsistent.  
·	If the target thread is manipulating the global state of a
	shared DLL, the state of the DLL could be destroyed, affecting
	other users of the DLL. 
The TerminateProcess function is used to unconditionally cause a
process to exit. Use it only in extreme circumstances. The state of
global data maintained by dynamic-link libraries (DLLs) may be
compromised if TerminateProcess is used rather than ExitProcess.
TerminateProcess causes all threads within a process to terminate, and
causes a process to exit, but DLLs attached to the process are not
notified that the process is terminating.
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )

>che dici (grazie per le risposte :), passo a socket asincroni?
Te li sconsiglio nella maniera piu' assoluta.
A questo punto preferisco la soluzione di chiudergli la socketa "sotto il
culo".


>se hai tempo, puoi spiegarmi il perche' di questa "assolutezza" :)?
Io le avevo usate prima di passare alla programmazione multi-threaded. Ho
avuto problemi di tutti i tipi forse per colpa mia, forse per colpa di MFC
(classe CAsyncSocket). Per fare funzionare qualcosa ho dovuto fare i salti
mortali, sto ancora cercando di rimuovere quel periodo :-) Quando sono
passato alle socket sincrone e il multithreading (e ho abbandonato MFC) mi
sono trovato molto meglio.
