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

Threads & Processus C++ Discussion :

arrêt brutal d'un thread


Sujet :

Threads & Processus C++

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Par défaut arrêt brutal d'un thread
    Bonjour,

    suite à un conseil donné, j’emploie un thread pour lancer une fonction (appelant d'autres fonctions) afin de pouvoir créer un bouton "Annuler".

    Ma difficulté vient qu'il semble s'arrêter au début de sa tâche.
    La fonction que lance le thread contient des fonctions lançant la lecture de répertoire ainsi que la lecture de fichiers csv et leurs insertions dans sql server.

    pour une raison que j'ignore, il s'arrête après avoir créé une table et avoir inséré le contenu du premier fichier ( en laissant tomber le reste des fichiers).

    Je me suis demandé si le problème ne venait pas des catchs qui se situent à l'intérieur des fonctions qui doivent interrompre le thread au moindre problème.

    Mon code fonctionne hors du thread mais dés que j'emploie le thread, je ne n'arrive pas à aller au bout et récupérer des informations comme le nombre d'insertions effectués. On dirait que le thread s'arrête brutalement.

    mon code est assez simple

    avant que l'IHM soit lancé, je crée le thread d'une fonction qui tourne en boucle jusqu'à ce qu'il reçoit un message.

    Dans mon main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread^ myThread = gcnew Thread( gcnew ThreadStart( attente ) );
          myThread->Start();
    Puis une boucle infinie qui attente un signal de démarrage

    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
    void setFlagActive()
    {
    	Test::flagscript = true;
    }
    bool reponse()
    {
    	return Test::flagscript;
    }
    void attente()
    {
    	//System::Windows::Forms::MessageBox::Show("Thread");
    	if (Test::flagscript == true)
    	{
    		//System::Windows::Forms::MessageBox::Show("flag true");
     
    	}
    	while(1)
    	{
    		if (reponse()== true)
    		{
    			System::Windows::Forms::MessageBox::Show("flag est vraie");
    			create_db();
    		choix_répertoire();
    		break;
    		}
    		Thread::Sleep(10);
    	}
     
    }
    Qu'est-ce qui peut interrompre brutalement un thread?

    merci d'avance pour toute idée.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Par défaut
    si tu penses que tu as des exceptions qui se lancent, utilise le debuggeur pour voir d'où elles partent. dans visual il suffit de cocher debug->exceptions, pouf tu coches tout.
    dans gcc y'a la meme chose faut juste trouver la commande

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Par défaut
    C'est ce que j'ai fait mais le probléme persiste

    Le thread continue de s'arrêter brutalement,
    il se peut que la cause ne soit pas dans les exceptions.
    Sur quatre fichiers, il continue à n'effectuer qu'un seul.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Par défaut
    J'ai fait un petit test et j'ai remarqué que cela fonctionne mais il faut attendre jusqu'au bout alors que je pensais que c'était fini.

    Auriez-vous une idée comment garder cliquable un bouton tant qu'un thread est en cours. Car depuis mon bouton démarrer j'envoie un message à mon thread pour lui dire de lancer une fonction. Mais comme il s'exécute à côté de l'ihm, le bouton annuler (qui ne fonctionne que lorsque le bouton démarrer marche) ne répond pas.

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonsoir.

    J'ai du mal à voir exactement qui fait quoi et surtout dans quel ordre dans tout ce bazar (nous n'avons pas le code du thread principal) mais je suis quasiment certain qu'il suffit de virer l'appel à MessageBox du worker thread.

    Ici, apparemment, il y a une fenêtre sur le thread principal et une autre sur le worker thread. Voici un principe à respecter en cas de problème tordu : tous les objets UI sur un seul thread, toutes les opérations longues sur un autre thread (le worker). Si le worker thread a besoin d'effectuer une opération UI, qu'il passe par Control.Invoke ou BeginInvoke.

    Théoriquement, on peut avoir des objets UI sur plusieurs threads. En pratique il faut bien comprendre comment le faire.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/09/2009, 15h36
  2. Mon application s'arrête brutalement sans lever d'Exception
    Par verbose dans le forum Général Java
    Réponses: 13
    Dernier message: 27/06/2009, 14h04
  3. Réponses: 2
    Dernier message: 05/03/2007, 16h45
  4. Arrêt brutal Pc Portable
    Par hegros dans le forum Ordinateurs
    Réponses: 24
    Dernier message: 13/02/2007, 22h39
  5. Fermeture de connexion en cas d'arrêt brutal
    Par Bartuk dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 30/05/2006, 16h12

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