Thread ?

galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020 - 22 juil. 2009 à 12:00
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020 - 24 juil. 2009 à 19:50
Bonjour
Une petite question sans doute basique mais je n'arrive pas à m'en sortir.
J'ai développé une application Windows sous dev-cpp, avec notamment un menu principal. Un des choix du menu lance une fonction qui peut être assez longue (algorithme de jeu qui peut prendre 2-3 minutes). Comment faire pour garder la possibilité de naviguer sur le menu principal pendant que cette fonction tourne ? (Actuellement si j'essaye d'accéder au menu il me dit "programme ne répond pas" jusqu'à ce que la fonction ait terminé.
Au lieu d'appeler la fonction directement j'ai essayé d'utiliser un CreateThread sur celle ci mais le résultat est le même ... Y a t il une histoire de priorité à définir ? Faut il à l'intérieur de ma fonction "redonner la main" de temps en temps au programme principal, et si oui comment faire ?
Merci

9 réponses

cs_TeniX Messages postés 118 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 11 décembre 2011 2
22 juil. 2009 à 13:02
Comment utilise tu CreateThread ?

//exemple

DWORD WINAPI MonThread(LPVOID lpParameter);
DWORD threadID;

//fonction principal
{
CreateThread(NULL,0,MonThread, NULL,0,&threadID);

}
DWORD WINAPI MonThread(LPVOID lpParameter)
{
//TON CODE
}


Ciao
0
gnairod Messages postés 37 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 avril 2010
22 juil. 2009 à 13:02
Fait voir ton code apers le CreateThread.
0
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
22 juil. 2009 à 16:00
Voici un bout de mon code :

DWORD WINAPI Fonction(LPVOID p)
{
Le code de ma fonction
return 0;
}

"Autre fonction qui lance le thread"()
{
HANDLE hTread;

hThread=CreateThread(NULL,0,Fonction,NULL,0,NULL);

if (hThread==NULL)
MessageBox(g_WndMainFrame,(LPSTR) "Echec de la céation du thread",(LPSTR) g_szClassName,MB_ICONINFORMATION | MB_OK);
else
{
DWORD dwWait;
dwWait = WaitForSingleObject(hThread,INFINITE);
if (WAIT_OBJECT_0 == dwWait)
MessageBox(g_WndMainFrame,(LPSTR) "Le thread est terminé",(LPSTR) g_szClassName,MB_ICONINFORMATION | MB_OK);
CloseHandle(hThread);
}
}


Merci
0
gnairod Messages postés 37 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 11 avril 2010
23 juil. 2009 à 05:32
Voila pourquoi ton application est fige :
dwWait = WaitForSingleObject(hThread,INFINITE);
En effet tu lances un thread mais appel WaitForSingleObject juste apres.

Tu pourrai lancer le thread et utiliser un timer qui toutes les 1 secondes regarde si le thread a termine avec WaitForSingleObject(hThread,1000).

Apres il y a surement mieux a faire mais il va falloir que tu y reflechisse ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
23 juil. 2009 à 10:35
Je vois pas trop.
Je veux juste que le thread aille jusqu'au bout mais que je puisse garder la main (pour éventuellement interrompre la fonction ou raccourcir son temps de réflexion si c'est trop long par exemple).
Pour reprendre la main il faut que je suspende le thread ? Je pensais que le simple fait de lancer un thread créait un processus à part qui se terminait quand il avait fini, tout en laissant la main à l'application principale, mais si je ne mets rien après CreateThread, l'application plante ...
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 juil. 2009 à 12:30
Créer un thread créé un thread, pas un processus.

Comme l'a expliqué gnairod, le problème est que tu demandes explicitement au thread principal d'attendre le thread secondaire avec WaitForSingleObject.

Suffit de l'enlever et le thread continuera sa route. Par contre, va falloire trouver une manière d'exécuter le CloseHandle.
0
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
24 juil. 2009 à 11:23
Si je mets le CloseHandle juste après le CreateThread, l'appli plante, est ce normal ?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
24 juil. 2009 à 11:32
Oui, c'est normal.

Il faut faire le CloseHandle après que le thread se soit terminé correctement.

Tu peux savoir si un thread s'est terminé en utilisant WaitForSingleObject (Rappelle toi, la fonction que tu viens d'enlever !). Le tout est de l'appeler au bon moment.

Par exemple, si tu as un bouton pour lancer les threads, tu peux faire quelque chose dans ce genre là (pseudo code) :

HANDLE hThread = NULL;

void FreeThread()
{
  if (hThread)
  {
    WaitForSingleObject(hThread);
    CloseHandle(hThread);
  }
}

void QuandJAppuieSurLeBouton()
{
  // On ferme le handle d'un éventuel thread précédent
  FreeThread();
  hThread = CreateThread();
}

Et il te faut aussi un CloseHandle pour le dernier thread, par exemple dans le main ou autre.

main()
{
  ...
  FreeThread();
}
0
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
24 juil. 2009 à 19:50
OK, c'est plus clair, merci pour ces renseignements.
0
Rejoignez-nous