AfxBeginThread ne repond pas

Résolu
ptitmanu Messages postés 23 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 8 février 2005 - 19 janv. 2005 à 10:10
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 19 janv. 2005 à 17:27
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

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
19 janv. 2005 à 17:27
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".
3
ptitmanu Messages postés 23 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 8 février 2005
19 janv. 2005 à 10:37
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...
0
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
19 janv. 2005 à 15:27
Utilise tu les fonctions d'attente (WaitForSingleObject) pour ton thread parent? Ca evite qu'il arrete prematurement ton thread enfant.
0
ptitmanu Messages postés 23 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 8 février 2005
19 janv. 2005 à 17:12
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.
0
Rejoignez-nous