IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Redémarrer un CWinThread


Sujet :

MFC

  1. #1
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut Redémarrer un CWinThread
    Bonjour,

    J'ai multi-threadé une fonction assez lourde pour accélérer un peu le traitement de mon application.

    Ca fonctionne, je peux paramétrer le nombre de threads de 1 à n

    Mainenant, dans la boucle de gestion de mes threads, je redémarre un thread de la façon suivante (qui est la même que la création ormis le delete) :
    - destruction du thread avec delete
    - création d'un nouveau thread avec AfxBeginThread
    - modification du membre du thread m_bAutoDelete à false
    - ResumeThread

    Y a t-il un moyen plus simple et surtout moins couteux en temps machine pour redémarrer mon thread ?

    je précise que la fonction threadée fait un traitement et retourne une valeur style 0 ou 1
    peut-etre faut-il que je la modifie elle aussi ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu peux le suspendre ...
    CWinThread::SuspendThread
    et le relancer par ResumeThread().

  3. #3
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    j'ai essayé le ResumeThread tout seul sans succès, c'est ce qui m'a ammené à faire un delete suivi d'un nouveau AfxBeginthread

    en gros, j'ai une boucle qui gère mes threads :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    	INT_PTR nIndexThread;
    	while(arThreads.GetCount() > 0)
    	{
    		// on rend la main au système
    		Sleep(1);
     
    		// puis on parcours les threads du dernier au premier
    		nIndexThread = arThreads.GetUpperBound();
    		for(; nIndexThread >= 0; nIndexThread--)
    		{
    			// récupération de l'état du thread
    			GetExitCodeThread(arThreads[nIndexThread]->m_hThread, &nResult);
    			// si le thread est actif
    			if(nResult == STILL_ACTIVE)
    				continue; // on passe au suivant
    			// si le thread n'est plus actif
    			// on regarde s'il y a encore des questions à traiter
    			if(nIndexQues < arQuestions.GetCount())
    			{
    				// on paramètre la nouvelle question à gérer
    				arParams[nIndexThread]->pQuesQuestion = arQuestions[nIndexQues++];
    				// et on relance le thread
    				delete arThreads[nIndexThread];
    				arThreads[nIndexThread] = AfxBeginThread(CAFF_FileSDic::MatchQuestionThread, arParams[nIndexThread], THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    				arThreads[nIndexThread]->m_bAutoDelete = false;
    				arThreads[nIndexThread]->ResumeThread();
    			}
    			else // plus de questions à traiter
    			{ // suppression du thread et de ses params
    				delete arThreads[nIndexThread];
    				arThreads.RemoveAt(nIndexThread);
    				delete arParams[nIndexThread];
    				arParams.RemoveAt(nIndexThread);
    			}
    		}
    	};
    comme la fonction threadée est terminée par un return, il faut peut-etre que je commence par là non ?

    je sais que c'est pas le top comme gestion de threads mais je commence à m'y mettre
    si vous avez des conseils je suis preneur
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    quand tu parle de redemarré un de tes thread, tu veux dire le faire executer a nouveau tout son code et non reprendre l'execution là ou elle était suspendue ( s il elle l'est)...

    dans ce cas je te conseille :

    faire qu il se relance avec une boucle
    OU
    faire que ton thread se tue tout seul (soritir de la boucle et m_bAutodelete=true)

    Tout ca dans le code du thread bien sur...

    mais si ton thread etait suspendu, ResumeThread est effectivement la meileure solution
    Pour les details, cherche tout seul !

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/10/2004, 09h39
  2. Script WMI : redémarrer un ordi distant : erreur
    Par goliath99 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 06/08/2004, 15h33
  3. Réponses: 4
    Dernier message: 06/04/2004, 21h57
  4. Eteindre ou redémarrer l'ordinateur
    Par Arnaudv6 dans le forum Assembleur
    Réponses: 10
    Dernier message: 11/03/2004, 12h29
  5. redémarrer un prog à partir d'un bouton
    Par yokito dans le forum Langage
    Réponses: 5
    Dernier message: 06/09/2002, 13h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo