Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
void sendAsynchronousMessage(TCHAR title[], TCHAR text[], int type){
DWORD dwThreadId;
//Params è una struct creata da me
Paramsparams={(TCHAR*)title,(TCHAR*)text, &type};
hThread = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)&sendMessage,
¶ms,
0,
&dwThreadId);
}
Mi sapreste dire perchè la variabile globale hThread dopo aver lanciato la funzione sendAsynchronousMessage non è più valida?
Dovrei praticamente far ritornare a questa funzione un HANDLE al thread lanciato(anzichè metterlo come variabile globale) ma una volta invocata alla riga di codice successiva l'handle non funziona più
P.S.: il codice sorgente non è C#, perchè cavolo è scritto così sopra il codice?
Ultima modifica effettuata da robrock80 il 27/02/2010 alle 21:02
Postato originariamente da robrock80: Mi sapreste dire perchè la variabile globale hThread dopo aver lanciato la funzione sendAsynchronousMessage non è più valida?
Se è globale, come fa a non essere valida? Che dici?
Testo quotato
Dovrei praticamente far ritornare a questa funzione un HANDLE al thread lanciato(anzichè metterlo come variabile globale) ma una volta invocata alla riga di codice successiva l'handle non funziona più
Se la funzione è
HANDLE sendAsynchronousMessage ...
allora sarà
return(CreateThread .... );
( In che senso "non funziona piu'"? )
Testo quotato
P.S.: il codice sorgente non è C#, perchè cavolo è scritto così sopra il codice?
Non ti preoccupare ... è un problema del forum ...
Ultima modifica effettuata da nessuno il 27/02/2010 alle 21:34
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Dopo aver invocato la funzione sendAsynchronousMessage invoco la funzione WaitForSingleObject passandogli l'Handle e praticamente il processo esplode. se invece la funzione WaitForSingleObject la invoco all'interno di sendAsynchronousMessage subito dopo aver creato il thread tutto funziona. Per adesso ho creato una variabile globale giusto per fare le prove visto che con una variabile ritornata non mi funziona: sembra che Windows invalidi gli Handle ai thread automaticamente quando si esce dalla funzione
Ultima modifica effettuata da robrock80 il 27/02/2010 alle 21:42
Se mostri il codice che hai scritto senza variabile globale, compresa la WaitForSingleObject, si capisce meglio ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Perdonami ... ma non avevi detto che "allocavi" l'handle utilizzandolo come se fosse un puntatore ... ecco perchè non capivo.
L'handle è un numero, non un puntatore ... devi restituirlo semplicemente al chiamante ...
In pratica la funzione deve essere
Codice sorgente - presumibilmente C#
HANDLE sendAsynchronousMessage(TCHAR title[], TCHAR text[], int type){
DWORD dwThreadId;
Paramsparams={(TCHAR*)title,(TCHAR*)text, &type};
return(CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)&sendMessage,
¶ms,
0, //Lancia il Thread immediatamente
&dwThreadId));
}
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Prima di provare con la variabile globale ho provato anche come hai detto te, ma niente, non ne vuole proprio sapere: sono convinto che Windows invalidi gli HANDLE quando si esce dalle funzioni in cui sono stati creati
Ovviamente devi eliminare quella free che non ha senso ...
Per il resto, funziona ...
Testo quotato
sono convinto che Windows invalidi gli HANDLE quando si esce dalle funzioni in cui sono stati creati
Ma neanche per sogno ...
Ultima modifica effettuata da nessuno il 27/02/2010 alle 22:50
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
Certo che il free ha senso: la memoria l'ho allocata all'interno della funzione e a me chi garantisce che la funzione CloseHandle contrassegna la memoria come riallocabile?
Comunque non è questo il problema, perchè se richiamo la funzione di Wait dentro la sendAsynchronousMessage, il programma non dà problemi.
Ho copiato e incollato la funzione come l'hai scritta te, ma niente, il processo esplode ancora.
Sarà un problema del compilatore? (Io uso MinGW)
Ultima modifica effettuata da robrock80 il 28/02/2010 alle 20:13