AfxBeginThread ne repond pas [Résolu]

Signaler
Messages postés
23
Date d'inscription
mardi 30 novembre 2004
Statut
Membre
Dernière intervention
8 février 2005
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Bonjour,

J'ai un petit soucis avec AfxBeginThread.... l'appel de la methode ne retourne jamais.

Je ne fais rien de spécial pourtant, je declare un objet CWinThread et
je lui associe la valuer de retour de la méthode AfxBeginThread, mais
celle ci ne rend jamais la main. Quelqu'un aurais une idée sur
l'origine possible du probleme ? Je ne trouve nul part des references à
ce genre de probleme. Si vous avez des pistes à me suggerer, je suis
preneur.

Merci.

Emmanuel.

ps: le code utilisé est vraiment tout simple:

UINT Vme2AvsThread(LPVOID thisPointer);
void VmeDlsDll::startVmeDlsPolling(void)
{
CWinThread * m_Vme2AvsThread = AfxBeginThread( Vme2AvsThread,
this ,
THREAD_PRIORITY_HIGHEST,
0,
CREATE_SUSPENDED,
NULL );
ResumeThread (m_Vme2AvsThread->m_hThread );
}

UINT Vme2AvsThread(LPVOID thisPointer)
{
VmeDlsDll* curVmeDls = (VmeDlsDll*) thisPointer;
//...//
return 0;
}

4 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Regarde le bouquin de richter s'il dit quelque chose la dessus :
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip

apparemnt il vaut mieux éviter de faire des appels à des fonctions situées dans d'autre dll dans dllmain (en particulier faire des appels aux MFC) car toutes les dll n'ont pas forcément été chargée lors l'appel à ton dllmain.

page

"You must remember that DLLs use DllMain functions to initialize themselves. When your DllMain executes, other DLLs in the same address space probably haven't executed their DllMain functions yet. This means that they have not initialized, so you should avoid calling functions imported from other DLLs. In addition, you should avoid calls to LoadLibrary(Ex) and FreeLibrary from inside DllMain because these functions can create dependency loops.
The Platform SDK documentation states that your DllMain should perform only simple initialization such as setting up thread local storage (discussed in [mk:@MSITStore:C:\Documents%20and%20Settings\ymorgan\Mes%20documents\Divers\Richter4.chm::/HTML/ch21a.htm Chapter 21]), creating kernel objects, and opening files. You must also avoid calls to User, Shell, ODBC, COM, RPC, and socket functions (or functions that call these functions) because their DLLs might not have initialized yet or the functions might call LoadLibrary(Ex) internally, again creating a dependency loop.


Also be aware that the same problems exist if you create global or static C++ objects because the constructor or destructor for these objects is called at the same time as your DllMain function".
Messages postés
23
Date d'inscription
mardi 30 novembre 2004
Statut
Membre
Dernière intervention
8 février 2005

J'ai oublié de preciser que je demarre le Thread dans le constructeur
d'une DLL. Je ne sais pas si cela a de l'importance ou non...
Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010

Utilise tu les fonctions d'attente (WaitForSingleObject) pour ton thread parent? Ca evite qu'il arrete prematurement ton thread enfant.
Messages postés
23
Date d'inscription
mardi 30 novembre 2004
Statut
Membre
Dernière intervention
8 février 2005

Salut,

Pour repondre à ta question, je n'utilise pas WaitForSingleObject. Je
ne sais pas à quoi cela sert. Mais je pense que cela ne vient pas de
là, puisque c'est le thread principal qui fige... ou du moins la
methode AfxBeginThread qui ne retourne pas.

J'ai essayé plusieurs methode pour creer des threads et toutes figent
lors de la création du thread lorsque la création se fait pendant le
"DLL Attach Process" .... Par contre il n'y a aucun probleme lorsque je
demarre le thread par la suite.

Est ce un comportement normal pour toi ?

Je vais voir avec WaitForSingleObject, mais je n'y crois pas...enfin
n'ayant pas franchement les idées tres claires sur le mecanisme
d'initialisation des DLL, je voir.

En tout cas merci.