threads et voir autres questions au 7ème message [MFC] - C++ - Programmation
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 ...
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);
}
Marsh Posté le 23-04-2002 à 14:27:43
Un pointeur vers une fonction est simplement le nom de la fonction ;-)
Marsh Posté le 23-04-2002 à 14:32:13
Euh, oui, autant pour moi !!
J'ai pas percuté, le pire c que j'utilise ça au boulot sans aucun souci !!
Essaie ceci :
AfxBeginThread(ThreadFunc, this)
[jfdsdjhfuetppo]--Message édité par Harkonnen le 23-04-2002 à 14:32:59--[/jfdsdjhfuetppo]
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]
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 !
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 !)
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
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]