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

Windows Discussion :

Interruption de thread


Sujet :

Windows

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 151
    Points : 154
    Points
    154
    Par défaut Interruption de thread
    Salut tt le monde,

    Je veux créer un petit prog pour échanger des données en réseau, et j'ai pour cela créé un thread serveur qui va attendre que quelqu'un se connecte puis echanger des données, ... :

    truc.h :

    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
    37
    38
    39
    40
    HANDLE FinThread;
    short StopThread;
    
    DWORD WINAPI Serveur(LPVOID lpParam)
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
        SOCKET sock;
        SOCKET csock;
        SOCKADDR_IN sin;
        SOCKADDR_IN csin;
        char buffer[1000],phrase[100];
        
        FinThread=CreateEvent(NULL,TRUE,FALSE,NULL);
        
        sock = socket(AF_INET, SOCK_STREAM, 0);
        sin.sin_addr.s_addr			= INADDR_ANY;
        sin.sin_family				= AF_INET;
        sin.sin_port				= htons(Num_Port);
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
        listen(sock, 0);
        while(1) // on attend tant que personne ne se connecte ou que StopThread passe à 1
        {
            int sinsize = sizeof(csin);
            // si quelqu'un se connecte
            if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
            {
                sprintf(phrase,"Connexion établie avec \"%s\"",inet_ntoa(csin.sin_addr));
                MessageBox(NULL,phrase,"Message",MB_OK);
                break;
            }
            if(StopThread==1) // si l'interruption du thread est demandé
                break;
        }
    
        SetEvent(FinThread);
    }
    
    DWORD WINAPI Client(LPVOID lpParam)
    { ... }
    J'initialise StopThread à 0 avant de lancer le thread serveur
    Pour l'arrêter, j'ai mis dans mon fichier "truc.c" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    StopThread=1;
    if( WaitForMultipleObject(FinThread,1000)==WAIT_TIMEOUT )
        MessageBox(NULL,"Problème de déconnexion","Message d'erreur",MB_OK);
    else
    {
        MessageBox(NULL,"Déconnexion réussie","Message",MB_OK);
        CloseHandle(FinThread);
    }
    Etant donné que StopThread passe à 1, on devrait sortir de la boucle et finir le thread, ce qui déclencherait l'évenement FinThread, pourtant, je n'arrive jamais à fermer le thread, il m'affiche tjs "Problème de déconnexion", comme si StopThread était resté à 0.
    Il ne sort de la boucle que qd quelqu'un se connecte. J'ai fait la même chose dans mon thread client, même problème.

    Si quelqu'un pouvait me dire d'où vient mon problème ?!

    J'ai essayé d'utiliser les fonctions PostThreadMessage() et PeekMessage() au lieu d'une variable globale pour fermer mon thread, mais le résultat est le même !

    Merci d'avance à quiconque peut m'éclairer sur le sujet

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut


    Déclare StopThread en volatile (il m'a fallu un moment pour comprendre quand j'ai moi-même eu ce problème, vu qu'aucun cours de C ne mentionnait ce petit détail).

    PS: puisque tu l'utilises en booléen, pourquoi le déclarer en short et non en BOOL, comme la plupart des fonctions de Windows? Ce serait plus explicite pour lire le source...

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    accept est une fonction bloquante. Elle rend la main une fois qu'une connexion a eu lieu. Tu peux utiliser select, ou mieux WSAEventSelect pour associer un event à ta socket. Dans ton thread tu fais alors un WaitForMultipleObjects/WSAWaitForMultipleObject sur l'event de la socket + un event FinThread.
    A ce sujet, ton event FinThread ne sert à rien, car tu peux dans le prog principal faire un WaitForXXX directement sur le handle du thread créé. L'event FinThread te servira alors à demander au thread de s'arrêter, au lieu de passer par une variable StopThread.

Discussions similaires

  1. Interruption de thread
    Par NoIdea dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 19/03/2014, 13h33
  2. Interruption de thread
    Par adn013 dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 21/08/2007, 09h47
  3. Interruption et reprise d'un Thread
    Par Nuro dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 28/02/2007, 21h34
  4. Interruption d'un Thread
    Par doudblast dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 11/03/2006, 17h30
  5. interrupt() de la classe thread
    Par canigu dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 25/12/2005, 14h01

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