[MFC] threads et voir autres questions au 7ème message

threads et voir autres questions au 7ème message [MFC] - C++ - Programmation

Marsh Posté le 23-04-2002 à 14:10:34    

J'ai une petite boite de dialogue avec une barre de loading et un bouton "Lancer". Je voudrais (on s'en doute..) que lorsque j'appuie sur Lancer, la barre se charge. Mais je voudrais que cela soit un thread qui fasse le truc. J'ai donc ma fonction OnLancer déclarée en static :
 
void CLoadingDlg::OnLancer()
{
 AfxBeginThread(ThreadFunc,&m_cLoad);  
}  
ThreadFunc est la fonction de thread et m_cLoad est la variable correspondante à la barre de loading.
 
Puis ma fonction de thread est :
 
UINT CLoadingDlg::ThreadFunc(LPVOID pParam)
{
 CProgressCtrl *pProgress = (CProgressCtrl*)pParam;
 pProgress->SetStep(1);
 pProgress->SetPos(0);
 while(pProgress->GetPos()!=99)
 {
  pProgress->StepIt();
 }
 return 0;
}
 
Et ça veut pas marcher, Visual me fait une erreur :
 
error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (__thiscall CLoadingDlg::*)(void *)'
 
Donc voilà ! Merci de m'aider, j'en ai trop marre !
 
Merci d'avance

 

[jfdsdjhfuetppo]--Message édité par torpe23 le 23-04-2002 à 15:32:22--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-04-2002 à 14:10:34   

Reply

Marsh Posté le 23-04-2002 à 14:12:17    

Les fonctions de thread sont soit des fonctions globales , ou alors si c est une méthode de classe, celle ci doit etre déclarée en statique ...

Reply

Marsh Posté le 23-04-2002 à 14:23:23    

Voici les 2 constructeurs de AfxBeginThread :
 
CWinThread* AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL  
);
CWinThread* AfxBeginThread(
   CRuntimeClass* pThreadClass,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL  
);
 
Tu utilises le 1er constructeur, donc le 1er paramètre doit être un pointeur vers ta fonction ThreadFunc.
 
Essaie ceci :
void CLoadingDlg: nLancer()  
{  
AfxBeginThread(&ThreadFunc,&m_cLoad);  
}

Reply

Marsh Posté le 23-04-2002 à 14:27:43    

Un pointeur vers une fonction est simplement le nom de la fonction ;-)

Reply

Marsh Posté le 23-04-2002 à 14:32:13    

Euh, oui, autant pour moi !!  :heink:  
J'ai pas percuté, le pire c que j'utilise ça au boulot sans aucun souci !!
 
Essaie ceci :
 
AfxBeginThread(ThreadFunc, this)
 
 :hello:

 

[jfdsdjhfuetppo]--Message édité par Harkonnen le 23-04-2002 à 14:32:59--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-04-2002 à 14:55:06    

Bon, je me suis encore chié dessus !!! Ca m'apprendra à mal lire ton source !
 
En fait, c'est pas la fonction OnLancer qui doit être déclarée en static, mais la fonction ThreadFunc !!

 

[jfdsdjhfuetppo]--Message édité par Harkonnen le 23-04-2002 à 14:55:28--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-04-2002 à 14:56:08    

merci à tous mais en fait, ce que j'avais fait marchait : j'avais seulement mis "static" pour le fonction de lancement (celle qui contient AfxBeginThread) au lieu de le mettre pour la fonction de thread. Et donc maintenant, ça marche !

Reply

Marsh Posté le 23-04-2002 à 15:35:08    

AUTRES QUESTIONS !!!
 
Voilà mes autres questions : quand mon thread a fini de rempli ma barre de loading, comment puis je faire pour en être informer et réactiver le bouton "Lancer" ( que j'aurais désactiver en lancant le thread )???
 
en fait, je n'avais qu'une question !  
 
Merci d'avance (encore !)

Reply

Marsh Posté le 23-04-2002 à 18:48:42    

Il y a une fonction qui s appelle WaitForSingleObject, mais je ne sais pas si elle repond a tes besoins

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed