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 :

Problème de Thread avec RS232


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 14
    Par défaut Problème de Thread avec RS232
    Bonjour, je souhaite creer une application multitache, qui génère automatiquement un sms en fonction de la valeur d'un thread.
    Je ne sais pas si j'ai utilisé la bonne méthode ... A mon avis j'ai oublier une étape ou confondu quelque chose car Visual me sort une erreur de mémoire ...
    Le but étant que dans une application, je génère un message différent en fonction que de la valeur que mon thread met dans ma memoire partagée.
    La liaison RS et l'envoi sans les Thread fonctionne parfaitement.

    Voici le code de mon fichier main.cpp
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #include <iostream>
    #include <time.h>
    #include <windows.h> 
    #include <stdio.h> 
    #include "C_RS232_Win_Overlapped.h"
    using namespace std ;
     
    char buf[128];
    int nb;
    char commande[] = "com1:96,8,n,1";
    char commande0[]="AT+CMGF=1\r\n";
    char commande1[]="AT+CMGS=\"+33XXXXXXXXX\"\r\n";
    char commande2[128];
    int Valeur1;
    int Valeur2;
    HANDLE h, hThread1, hThread2; 
    HANDLE hMutex; 
    DWORD Thread1ID, Thread1Param, Thread2ID, Thread2Param; 
    BOOL Res; 
    HANDLE Tableau[2]; 
     
    DWORD WINAPI Thread1( LPVOID lpParam ) 
    { 
    	cout<<"Valeur du Thread 1 :";
    	cin>>Valeur1;
    	if (Valeur1=1)
    		{
    C_Rs232_Win_Overlapped rsWin(commande);
    		rsWin.EnvoyerMessage("AT+CPIN=2580\r",13);
    		Sleep(2000);
    		rsWin.EnvoyerMessage(commande0,11);
    		Sleep(1000);
    		rsWin.EnvoyerMessage(commande1,strlen(commande1));
    		rsWin.EnvoyerMessage("SURCONSOMMMATION \rEnergie : Eau",31);
    		Sleep(3000);
    		commande2[0]=0x1A;
    		commande2[1]=0;
    		rsWin.EnvoyerMessage(commande2,1);
    		commande2[0]=0x0A;
    		commande2[2]=0;
    		rsWin.EnvoyerMessage(commande2,1);
    		commande2[0]=0x0D;
    		commande2[1]=0;
    		rsWin.EnvoyerMessage(commande2,1);
     
    		//nb = rsWin.LireMessage(buf , 128);
    		buf[nb-1] = 0;
     
     
    		//nb = rsWin.LireMessage(buf , 128 , 0x0d);
    		//buf[nb-1] = 0;
    	}
    ReleaseMutex(hMutex); 
    return 0; 
    } 
     
    DWORD WINAPI Thread2( LPVOID lpParam ) 
    { 
    	cout<<"Valeur du Thread 2 :";
    	cin>>Valeur2;
    	if(Valeur2=1)
    {
    C_Rs232_Win_Overlapped rsWin(commande);
    		rsWin.EnvoyerMessage("AT+CPIN=2580\r",13);
    		Sleep(2000);
    		rsWin.EnvoyerMessage(commande0,11);
    		Sleep(1000);
    		rsWin.EnvoyerMessage(commande1,strlen(commande1));
    		rsWin.EnvoyerMessage("SURCONSOMMMATION \rEnergie : Elec",32);
    		Sleep(3000);
    		commande2[0]=0x1A;
    		commande2[1]=0;
    		rsWin.EnvoyerMessage(commande2,1);
    		commande2[0]=0x0A;
    		commande2[2]=0;
    		rsWin.EnvoyerMessage(commande2,1);
    		commande2[0]=0x0D;
    		commande2[1]=0;
    		rsWin.EnvoyerMessage(commande2,1);
     
    		//nb = rsWin.LireMessage(buf , 128);
    		buf[nb-1] = 0;
     
     
    		//nb = rsWin.LireMessage(buf , 128 , 0x0d);
    		//buf[nb-1] = 0;
    	}
    		ReleaseMutex(hMutex); 
    return 0; 
    } 
     
    void main()
    {	
    printf("Deux threads ecrivent a l'ecran avec mutex...\n\n\r"); 
    hMutex = CreateMutex(NULL, FALSE, NULL); 
    hThread1 = CreateThread(NULL, 0, Thread1, &Thread1Param, 0, &Thread1ID); 
    Tableau[0] = hThread1; 
    getchar();
    hThread2 = CreateThread(NULL, 0, Thread2, &Thread2Param, 0, &Thread2ID); 
    getchar();
    Tableau[1] = hThread2; 
    WaitForMultipleObjects(2, Tableau, TRUE, INFINITE); 
    getchar();
    	}
    J'espère que quelqu'un pourra résoudre mon soucis

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    salut,

    Ton mutex ne sert à rien.

    tu lances les 2 threads en même temps ou est ce que tu attends que le 1er finisse avant d'appuyer sur une touche ?

    ne sachant pas ce qu'est C_Rs232_Win_Overlapped, si tu lances les 2 threads il risque d'y avoir 2 ouvertures simultanée du port COM, donc ça va coincer.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 14
    Par défaut
    Dans l'optique de ce que je veux faire, j'ai besoin du mutex, je veux que chaque thread ait un accès exclusif à ma méthode permettant d'ouvrir la liaison RS232.
    en gros j'aimerais que mon appli me demande quel est la valeur de chaque thread (0 ou 1)
    En fonction de ca j'envoi le msg correspondant.
    Or si le thread 1 est à 1, je veux attendre que le thread 2 attente que thread 1 libère l'espace mémoire, et qu'il ai remit la valeur à 0 avant de pouvoir venir inscrire son niveau ... D’où ma volonté de mettre un mutex

  4. #4
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    salut,

    T'as un problème de synchronisation et de conception, sommairement il te faut une fonction d'attente comme WaitForSingleObject de ton sémaphore, enfin mutex quoi, en amont de "cout<<"Valeur du Thread x :";" afin d'empêcher l'accès concurrentiel à ta console et à ton interface COM, aussi, il faut corriger tes tests if avec == et non =. Et puis sache aussi que tu peux utiliser la même fonction pour plusieurs threads, parce que celles que tu présentes ne semblent pas avoir de différences notables.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 14
    Par défaut
    Merci pour ta réponse. J'ai donc reprit mon code en tenant compte de ta remarque et je l'ai repris avec un prof me conseillant de garder mon mutex, mais d'y ajouter des evenements ... j'ai donc mis mis ca en place et malgre le resetevent et release mutex je ne peux pas utiliser plus d'une fois chaque thread ... je ne vois pas d'ou cela peux venir ... je vous post mon code des que possible si vous voyez une grossiere erreur de ma part ... (cela ne m'étonnerait pas --")

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 14
    Par défaut
    J'ai essayé de mettre le ResetEvent et ReleaseMutex en fin de Thread comme dans le thread 2, et de le mettre dans mon main comme le thread 1. Et pourtant aucun des 2 thread ne veut se lancer plus d'une fois, meme si dans ma console je met met Valeur1 à 1 ...
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    #include <iostream>
    #include <time.h>
    #include <windows.h> 
    #include <stdio.h> 
    #include "C_RS232_Win_Overlapped.h"
    using namespace std ;
    C_Rs232_Win_Overlapped *rsWin;
    char buf[128];
    int nb;
    char commande[] = "com1:96,8,n,1";
    char commande0[]="AT+CMGF=1\r\n";
    char commande1[]="AT+CMGS=\"+33699285177\"\r\n";
    char commande2[128];
    int Valeur1;
     
    HANDLE h, hThread1, hThread2; 
    HANDLE hMutex; 
    DWORD Thread1ID, Thread1Param, Thread2ID, Thread2Param; 
    BOOL Res; 
    HANDLE Tableau[2]; 
    HANDLE hEventEau;
    HANDLE hEventElec;
     
    DWORD WINAPI Thread1( LPVOID lpParam ) 
    { 
    WaitForSingleObject(hEventEau, INFINITE);
    WaitForSingleObject(hMutex, INFINITE);	
     
    		rsWin->EnvoyerMessage("AT+CPIN=1234\r",13);
    		Sleep(2000);
    		rsWin->EnvoyerMessage(commande0,11);
    		Sleep(1000);
    		rsWin->EnvoyerMessage(commande1,strlen(commande1));
    		rsWin->EnvoyerMessage("SURCONSOMMMATION \rEnergie : Eau",31);
    		Sleep(4000);
    		commande2[0]=0x1A;
    		commande2[1]=0;
    		rsWin->EnvoyerMessage(commande2,1);
    		commande2[0]=0x0A;
    		commande2[2]=0;
    		rsWin->EnvoyerMessage(commande2,1);
    		commande2[0]=0x0D;
    		commande2[1]=0;
    		rsWin->EnvoyerMessage(commande2,1);
     
    		//nb = rsWin->LireMessage(buf , 128);
    		buf[nb-1] = 0;
     
    		//nb = rsWin->LireMessage(buf , 128 , 0x0d);
    		//buf[nb-1] = 0;
     
     
     
     
    return 0; 
    } 
     
    DWORD WINAPI Thread2( LPVOID lpParam ) 
    { 
     
    WaitForSingleObject(hEventElec, INFINITE);
    WaitForSingleObject(hMutex, INFINITE);
     
    		rsWin->EnvoyerMessage("AT+CPIN=1234\r",13);
    		Sleep(2000);
    		rsWin->EnvoyerMessage(commande0,11);
    		Sleep(1000);
    		rsWin->EnvoyerMessage(commande1,strlen(commande1));
    		rsWin->EnvoyerMessage("SURCONSOMMMATION \rEnergie : Elec",32);
    		Sleep(5000);
    		commande2[0]=0x1A;
    		commande2[1]=0;
    		rsWin->EnvoyerMessage(commande2,1);
    		commande2[0]=0x0A;
    		commande2[2]=0;
    		rsWin->EnvoyerMessage(commande2,1);
    		commande2[0]=0x0D;
    		commande2[1]=0;
    		rsWin->EnvoyerMessage(commande2,1);
     
    		//nb = rsWin.LireMessage(buf , 128);
    		buf[nb-1] = 0;
     
     
    		//nb = rsWin.LireMessage(buf , 128 , 0x0d);
    		//buf[nb-1] = 0;
    	ResetEvent(hEventElec);
    		ReleaseMutex(hMutex); 
     
    	 return 0;
    } 
     
    void main()
    {	
     
     
     rsWin=new C_Rs232_Win_Overlapped(commande);
    printf("Deux threads ecrivent a l'ecran avec mutex...\n\n\r"); 
    hEventEau = CreateEvent(NULL, TRUE, FALSE, "Surconsommation Eau"); 
    hEventElec = CreateEvent(NULL, TRUE, FALSE, "Surconsommation Elec"); 
    hMutex = CreateMutex(NULL, FALSE, NULL); 
    hThread1 = CreateThread(NULL, 0, Thread1, &Thread1Param, 0, &Thread1ID); 
    Tableau[0] = hThread1; 
    hThread2 = CreateThread(NULL, 0, Thread2, &Thread2Param, 0, &Thread2ID); 
    Tableau[1] = hThread2; 
    while(1)
    {	
    	Valeur1=0;
    	cout<<"Valeur 1 : ";
    	cin>>Valeur1;
    	if (Valeur1==1)
    	{
    		SetEvent(hEventEau);
    		ResetEvent(hEventEau);
    		ReleaseMutex(hMutex); 
     
    	}
    	if (Valeur1==2)
    	{
    		SetEvent(hEventElec);
     
    	}
     
    }
     
    WaitForMultipleObjects(2, Tableau, TRUE, INFINITE); 
    getchar();
    	}

  7. #7
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Une fois que ta "fonction thread" arrive à return, ton thread est détruit... pour empêcher cela, il te faut non seulement une boucle genre while () mais aussi réfléchir à un mécanisme élégant pour terminer proprement ton thread... Pense également à utiliser les facilités proposées par le système par exemple si tu mets false en 2ème paramètre à ton CreateEvent t'as plus à te préoccuper des ResetEvent, et ça semble approprié pour ce cas...

    Mais je ne saurais trop de conseiller de faire d'abord un code épurer pour bien appréhender le mécanisme des "threads" et des fonctions d'attentes...

Discussions similaires

  1. problème de thread avec setAutoCreateRowSorter
    Par boboss123 dans le forum Interfaces Graphiques en Java
    Réponses: 0
    Dernier message: 25/04/2014, 11h46
  2. Problème de threads avec RCP (SWT inside)
    Par slashmax dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 11/07/2008, 15h00
  3. problème de Threads avec Excel
    Par ooxoo dans le forum MFC
    Réponses: 3
    Dernier message: 15/05/2008, 22h55
  4. Problème SWT & thread avec readLine()
    Par TheFuzion dans le forum Général Java
    Réponses: 1
    Dernier message: 06/05/2007, 18h42
  5. Réponses: 7
    Dernier message: 18/09/2006, 22h01

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