Fermeture prématurée d'un thread [VISUAL C++] - Programmation
Marsh Posté le 03-06-2001 à 21:07:18
C'est toi qui décide ce que tu veux envoyer comme code de retour.
Il y a aussi ExitThred et TerminateThread.
Marsh Posté le 04-06-2001 à 23:45:15
Ce ne serait pas la valeur retournée par la fonction que je passe en paramètre de AfxBeginThread( ) ???
Marsh Posté le 05-06-2001 à 10:18:28
Ca ne peut pas être possible ?
Etant donné que cette valeur est retournée quand la fonction a fini de s'exécuter, comment faire pour terminer le thread avant que cette fonction ne soit pas terminée ? puisque la valeur n'est pas encore retournée...
Marsh Posté le 05-06-2001 à 10:23:31
guillot a écrit a écrit : Ca ne peut pas être possible ? Etant donné que cette valeur est retournée quand la fonction a fini de s'exécuter, comment faire pour terminer le thread avant que cette fonction ne soit pas terminée ? puisque la valeur n'est pas encore retournée... |
justement, TU fixe la valeur de retour de cette fonction quand, dans ton thread, tu fait AfxEndThread(). Par exemple, si tu mets 1 en paramètre de AfxEndThread(), ta fonction AfxBeginThread() rendra 1.
C ça Verdoux !?
Marsh Posté le 05-06-2001 à 10:43:58
Nan je pense pas... La fonction AfxBeginThread renvoie un pointeur sur un objet de type CWinThread, elle ne peut renvoyer un entier...
Marsh Posté le 05-06-2001 à 10:48:06
Si je peux me permettre :
l'idee de finir un Thread "de l'exterieur" est en general une mauvaise idee.... qui se passe rarement bien et dont les consequences peuvent etre les plus inatendues....
En general ne veux pas dire toujours...
Ceci dit, je vous laisse debattre de la methode a utiliser n'etant pas tres competente en Windows est encore moins en MFC...
[edit]--Message édité par BENB--[/edit]
Marsh Posté le 05-06-2001 à 10:51:46
A vrai dire, on m'a toujours déconseillé de faire ainsi !
Mais dans mon cas, je ne vois pas comment faire autrement.
En fait cette idée de terminer un thread prématurément est venue du fait que je souhaitais faire un client FTP en Visual C++ et que j'aurais aimé que l'utilisateur puisse annuler un téléchargement.
Mon téléchargement se fait dans un thread, et le seul moyen que je connaisse pour le stopper est de terminer le thread...
De plus, je souhaite faire de cette ménière pour des raisons de temps. Ce client FTP va être présenté en tant que projet à mon examen du BTS dans 2 semaines et j'en ai d'autres à terminer, c'est pour ça que j'aimerai finir cette dernière fonctionnalité
Marsh Posté le 05-06-2001 à 11:02:48
Ton thread peut vérifier régulièrement l'état d'une variable et agir selon cet état.
Sinon il y a la fonction TerminateThread:
http://msdn.microsoft.com/library/ [...] d_7h2c.htm
Mais MS avertit:
"TerminateThread is a dangerous function that should only be used in the most extreme cases."
"Warning The TerminateThread and TerminateProcess functions should be used only in extreme circumstances, since they do not allow threads to clean up, do not notify attached DLLs, and do not free the initial stack. The following steps provide a better solution:
- Create an event object using the CreateEvent function.
- Create the threads.
- Each thread monitors the event state by calling the WaitForSingleObject function. Use a wait time-out interval of zero.
- Each thread terminates its own execution when the event is set to the signaled state (WaitForSingleObject returns WAIT_OBJECT_0).
"
[edit]--Message édité par Verdoux--[/edit]
Marsh Posté le 05-06-2001 à 11:05:48
Merci beaucoup !
Je vais tenter de voir ça !
en fait je n'ai pas pu tester TerminateThread() vu qu'il demande le CD3 de la MSDN et je n'ai que le 1 et 2 :=)
Marsh Posté le 03-06-2001 à 19:08:16
Bonjour,
Dans mon application, j'ai créé un thread lançant une opération pouvant durer très longtemps (plusieurs heures). L'ennui, c'est que j'aimerai insérer dans mon interface graphique un bouton "Annuler" permettant de stopper et détruire ce thread.
J'ai vu que l'utilisation de la procédure AfxEndThread() était possible. Mais il demande le code de sortie ("exitcode" ) de mon thread.
Comment le récupérer ?
Apparemment il faut utiliser "GetExitCodeThread()" pour récupérer la valeur de l'exitcode en lui passant comme paramètres le HANDLE du thread (que j'ai pu récupérer) ainsi que la variable dans laquelle sera copiée l'exitcode.
L'ennui c'est que je récupère un LPDWORD et qu'il me faut un UINT comme paramètre de AfxEndThread().
Comment faire ? (un cast ne fonctionne pas)
Quelqu'un pourrait me donner un exemple SVP ?
Merci d'avance