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 :

debuter thread win32


Sujet :

Threads & Processus C++

  1. #1
    Membre averti Avatar de Fifou625
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 36
    Par défaut debuter thread win32
    bonjour le code suivant marche de façon indefinie 2 thread sont executé des fois 3 voir 4 rarement 5
    et des fois j'ai des erreurs de segmentation

    je debarque en programmation multi-tache
    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
    #include <Windows.h>
    #include <Winbase.h> 
    DWORD WINAPI ThreadProc(LPVOID arg)
    {    
       int *myNumber = (int*)arg;
       while(*myNumber < 2000)
    		(*myNumber)++;
       ExitThread(NO_ERROR);
     
     return 0;
    }
     
    int main()
    {
    	SECURITY_ATTRIBUTES attr;
     
    	int gogol[5]={8,6,3,1,4};
    	HANDLE h[5]={0};
    	attr.nLength = sizeof(SECURITY_ATTRIBUTES);  
        attr.lpSecurityDescriptor = NULL;  
        attr.bInheritHandle = 0;
    	DWORD  dwExitCode[5] ={0};
     
    	for(unsigned int i=0;i<5;++i)
    	{
    		h[i]=(HANDLE)CreateThread(&attr,0, ThreadProc ,(LPVOID)&(gogol[i]), 0,0);
    	}
    	miaw:
    	for(unsigned int i=0;i<5;++i)
    	{
    		GetExitCodeThread(h[i], &dwExitCode[i]);
    		if((dwExitCode[0]==NO_ERROR)&&(dwExitCode[1]==NO_ERROR)&&(dwExitCode[2]==NO_ERROR)&&(dwExitCode[3]==NO_ERROR)&&(dwExitCode[4]==NO_ERROR))
    			break;
    		else
    			goto miaw;
    	}
     
    }
    les 5 threads accedent "normalement" a des données sans interdependance entre eux il ne devrait pas avoir besoin de mutex etc..
    peut etre le problème est qu'il manque une fonction pour attendre les la fin des threads
    merci de me corriger

  2. #2
    Membre averti Avatar de Fifou625
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 36
    Par défaut
    a priori c'est resolu avec du code en carton ; il fallait bien attendre que les thread renvoie NO_ERROR
    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
    #include <Windows.h>
    #include <Winbase.h> 
    DWORD WINAPI ThreadProc(LPVOID arg)
    {    
       int *myNumber = (int*)arg;
       while(*myNumber < 2000)
    		(*myNumber)++;
       ExitThread(NO_ERROR);
    }
     
    int main()
    {
    	SECURITY_ATTRIBUTES attr;
     
    	int gogol[5]={8,6,3,1,4};
    	HANDLE h[5]={0};
    	attr.nLength = sizeof(SECURITY_ATTRIBUTES);  
        attr.lpSecurityDescriptor = NULL;  
        attr.bInheritHandle = 0;
    	DWORD  dwExitCode[5] ={0};
     
    	for(unsigned int i=0;i<5;++i)
    	{
    		h[i]=(HANDLE)CreateThread(&attr,0, ThreadProc ,(LPVOID)&(gogol[i]), 0,0);
    	}
    	miaw:
    	for(unsigned int i=0;i<5;++i)
    	{
    		GetExitCodeThread(h[i], &dwExitCode[i]);
    	}
    	if(!((dwExitCode[0]==NO_ERROR)&&(dwExitCode[1]==NO_ERROR)&&(dwExitCode[2]==NO_ERROR)&&(dwExitCode[3]==NO_ERROR)&&(dwExitCode[4]==NO_ERROR)))
    		goto miaw;
    }
    si il ya un code plus intelligent (avec d'autre fonction que GetExitCodeThread() je suis preneur)
    (osef de goto c'est ecris à la va vite , pareille pour la boucle)

  3. #3

  4. #4
    Membre averti Avatar de Fifou625
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 36

  5. #5
    Membre averti Avatar de Fifou625
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 36
    Par défaut
    en gros ça donne ça
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <Windows.h>
    #include <Winbase.h> 
    #include <iostream>
    DWORD WINAPI ThreadProc(LPVOID arg)
    {    
       int *myNumber = (int*)arg;
       while(*myNumber < 2000)
    		(*myNumber)++;
       ExitThread(NO_ERROR);
    }
     
    int main()
    {
    	SECURITY_ATTRIBUTES attr;
     
    	int gogol[5]={8,6,3,1,4};
    	HANDLE h[5]={0};
    	attr.nLength = sizeof(SECURITY_ATTRIBUTES);  
        attr.lpSecurityDescriptor = NULL;  
        attr.bInheritHandle = 0;
    	DWORD  dwExitCode[5] ={0};
     
    	for(unsigned int i=0;i<5;++i)
    	{
    		h[i]=(HANDLE)CreateThread(&attr,0, ThreadProc ,(LPVOID)&(gogol[i]), 0,0);
    	}
    	/*
    	miaw:
    	for(unsigned int i=0;i<5;++i)
    	{
    		GetExitCodeThread(h[i], &dwExitCode[i]);
    	}
    	if(!((dwExitCode[0]==NO_ERROR)&&(dwExitCode[1]==NO_ERROR)&&(dwExitCode[2]==NO_ERROR)&&(dwExitCode[3]==NO_ERROR)&&(dwExitCode[4]==NO_ERROR)))
    		goto miaw;
    		*/
    	using namespace std;
    	DWORD er=0;
     
    	do
    	{
     
    		switch(er=WaitForMultipleObjects(5,h,TRUE,0))
    		{
    		case WAIT_OBJECT_0:
    			cout << "WAIT_OBJECT_0" << endl;
    			break;
    		case WAIT_ABANDONED_0:
    			cout << "WAIT_ABANDONED_0" << endl;
    			break;
    		case WAIT_TIMEOUT:
    			cout << "WAIT_TIMEOUT" << endl;
    			break;
    		case WAIT_FAILED:
    			cout << "WAIT_FAILED" << endl;
    			break;
    		default : //never happen
    			break;
    		}
    	}while(er==WAIT_TIMEOUT);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Threads Win32]join et queue
    Par NiamorH dans le forum Windows
    Réponses: 2
    Dernier message: 03/04/2007, 11h48
  2. Problème Thread & win32
    Par Goupo dans le forum Général Python
    Réponses: 3
    Dernier message: 06/02/2007, 22h41
  3. [debutant]threads - variables partagées.
    Par nivose110 dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 18/01/2006, 06h34
  4. [débutant][Thread] wait et NotifyAll
    Par norkius dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 14/03/2005, 15h28
  5. [Débutant][Threads] Problème de synchronisation
    Par sephile dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 02/01/2005, 23h29

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