Newsgroup: it.comp.programmare.win32
Titolo: Problema con CreateThread e WaitForSingleObject

Ho il seguente problema:
in pratica creo un thread con la funzione specificata in oggetto
che a sua volta esegue una funzione passata come parametro e il thread
principale si mette in attesa che termini il thread figlio;
Il problema e che inserendo uno sleep di 10 secondi nella funzione 
richiamata nel nuovo thread, noto dai file di log inseriti nel thread
principale, che quest ultimo esce subito dall'attesa di fine nuovo 
thread. Questo è parte del codice del thread principale:
temp->thread_handle = CreateThread(NULL, 0, SplitAndSend, (void *) temp, 
0, &temp->thread_id);
...
...
printf("\nEntro in attesa...");
WaitForSingleObject(&temp->thread_handle, INFINITE);
GetExitCodeThread(&temp->thread_handle, ret);
CloseHandle(&temp->thread_handle);
printf("\nFine attesa");
Durante il lasso di tempo del nuovo thread (per cui non è ancora 
terminato), l'output mi porta già la voce "Fine attesa".
Qualcuno mi sa spiegare il motivo per cui non si mette in attesa??
Io so che un thread in esecuzione è non segnalato, per cui la 
WaitForSingleObject si dovrebbe mettere in attesa!!
Ciao e grazie

 printf("\nFine attesa");
Ho controllato il valore di ritorno della WaitForSingleObject,
e mi da un bel numero 6, ovvero:
ERROR_INVALID_HANDLE 	The handle is invalid
ma come è possibile?!?!
per scrupolo gli ho passato anche l'id del thread, restituendo
lo stesso errore!!!!

> WaitForSingleObject(&temp->thread_handle, INFINITE);
C'è una & di troppo.
-- 
Valter Minute
(the reply address of this message is invalid,
but you may be able to guess the right one)

 
E lo so, ma senza l'indirizzo mi segnala errore!

 
Che errore?


 
Prima non me lo compilava...adesso si! mah...
adesso ho un'altro errore!
la connect() che prima mi funzionava (sto convertendo una lib da single 
a multi threads), adesso mi va in errore!
i parametri sono tutti corretti, ma non ritorna con successo! :-(

 i parametri sono tutti corretti, ma non ritorna con successo! :-(
Che errore ritorna? Puoi usare la GetLastError o la WSAGetLastError per 
recuperare il codice.
Dire che una funzione va in errore senza riportare il codice di errore 
e un esempio di come č utilizzata non serve a molto per capire il tuo 
problema.
Abituati a essere pių preciso.


 problema.
Sempre lo stesso errore: 183!

> problema.
Non c'è nulla da dire o far vedere!!!
Questo è il codice:
    if (connect(curSock, (cast_socket) &addr, sizeof(addr)) != 0) {
	fprintf(fout, "\n(GetConnection) ERROR CONNECTION - %d!!", 	 
                   WSAGetLastError());
}
P.S. non riporto la parte precedente, perchè il codice con tutti i 
controlli di errore, arriva correttamente sino alla if (connect())!
curSock è inizializzato, addr è riempieto correttamente (è lo stesso 
codice che prima funzionava), solo che la chiamata restituisce l'errore 183!
Ripeto: il codice è lo stesso di quando era ad un thread e funzionava;
nella trasformazione a multithread, in realtà il codice non è stato
modificato per nulla!

 temp->thread_handle = CreateThread(NULL, 0, SplitAndSend, (void *) temp, 
Non credo che sia la causa del tuo problema ma ti avverto che è 
pericoloso chiamare direttamente CreateThread.
Cito da MSDN:
"A thread that uses functions from the C run-time libraries should use 
the beginthread and endthread C run-time functions for thread management 
rather than CreateThread and ExitThread. Failure to do so results in 
small memory leaks when ExitThread is called."
Aggiungo che se utilizzi MFC dovresti evitare pure di chiamare 
beginthread, ma piuttosto AfxBeginThread.
Ciao
E.G.

 beginthread, ma piuttosto AfxBeginThread.
Non uso questo framework...