Paramètres d'un Thread

cs_HicksCorp Messages postés 3 Date d'inscription vendredi 2 août 2002 Statut Membre Dernière intervention 27 février 2005 - 27 févr. 2005 à 12:27
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 27 févr. 2005 à 13:51
Bonjour,



Je crée une DLL qui prends la main sur un installshield Wizard.

Jusqu'ici tout va bien, jusqu'au moment où je décide de créer le thread
qui va downloader les fichiers... En gros je n'arrive pas à trouver
comment passer une tructure, une chaine, ou un pointeur à mon thread.
Dans l'idéal, j'aimerai lui passer une structure.



Ma structure a cette gueule en gros pour le paramètre qui m'interesse:

struct DownloadThreadArgs

{

LPTSTR pFileToDownload;

};



Ensuite dans mon code:



DownloadThreadArgs paramsStruct;

paramsStruct.pFileToDownload = pFile;
hThread = CreateThread(NULL, 0, Download_Thread_Func, &paramsStruct, 0, &dwThreadId);



Sachant que la var hThread est ok, que pFile est du type LPTSTR et que
pFile a l'air OK car quand je fais un MessageBox(NULL, pFile, "Debug",
0) dessus il me donne la chaine de fichier...



Et ma fonction de thread:

DWORD WINAPI Download_Thread_Func(LPVOID lpParam)

{

DownloadThreadArgs params = *(DownloadThreadArgs*)lpParam;

MessageBox(NULL, params.pFileToDownload, "Got Str", 0);

return 0;

}



Toute aide est appréciée, soyez pas trop durs j'ai pas dormi :)



Pierre

3 réponses

cs_HicksCorp Messages postés 3 Date d'inscription vendredi 2 août 2002 Statut Membre Dernière intervention 27 février 2005
27 févr. 2005 à 12:36
Je viens de reitérer quelques tests pour les poster:



Dites moi où je me gourre, dans ce test je voudrais passer un array de chars en paramètres du thread:



char szSomeStr[1024];

char * pSomeStr = szSomeStr;

sprintf(pSomeStr, "Ceci est un monstrueux test.");

hThread = CreateThread(NULL, 0, Download_Thread_Func, pSomeStr, 0, &dwThreadId);



et ma fonction de thread;

DWORD WINAPI Download_Thread_Func(LPVOID lpParam)

{

char * pReceived = (char *)lpParam;

MessageBox(NULL, pReceived, "Debug", 0);

return 0;

}



Le truc c'est que le message de debug m'affiche un messagebox vide...



Merci d'avance, si vous voulez plus d'infos demandez :)



Pierre
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 févr. 2005 à 13:19
Si szSomeStr est une variable locale, tu ne devrais pas l'utiliser dans
le thread, car rien ne permet d'affirmer qu'elle existe encore quand tu
l'utilise dans le thread. Utilise une variable globale, ou bien alloue
avec HeapAlloc et ne libère qu'à la fin du Thread
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 févr. 2005 à 13:51
Faire tres attention au HeapAlloc() interne à un thread, il faut garantir qu'il n'y en aura pas d'autre ailleurs pendant la durée de vie du thread sinon source de bug très difficile à retrouver.

Faire le HeapAlloc() par l'appelant et sa desalloc à la fermeture du thread.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous