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 :

[Multithreading] MultiThreading et CheckSynchronize


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut [Multithreading] MultiThreading et CheckSynchronize
    Bonjour,

    J'ai besoin de trapper l'événement PortCharReceive de la classe TComPort et pour faire cela j'utilise la fonction CheckSynchronize depuis le thread principal.

    J'essaye de faire la même chose depuis un autre thread et j'ai une erreur comme quoi on ne peut pas faire un CheckSynchronize depuis un autre thread que le thread principal.

    Est ce que c'est par hasard possible d'appeler cette fonction depuis un autre thread que le thread principal ? (D'aprés ce que j'ai vu c'est pas possible mais je pose la question à tout hasard)

    Sinon deuxième question, est ce qu'il est possible de trapper un événement windows depuis un thread qui n'est pas le thread principal ?


    Merci

  2. #2
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Salut,

    Mais de quoi nous parle tu ?
    Précise quelle lib, quelle environement....

    Pour ce qui est de la deuxième question c non, pas possible directement.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Précisions
    Hello,

    Merci de la réponse

    Alors j'utilise Borland Developpeur Studio 2006

    Je fais une DLL de type VCL.

    J'utilise la library CPort.hpp pour communiquer avec le port com et j'ai une boucle du style

    while('Rien reçu sur le port com' && i<15)
    {
    j=0;
    i++;
    Application->ProcessMessages();
    while(!CheckSynchronize(10) && j<5)
    {
    j++;
    }
    Sleep(100);
    }

    Si j'appel une fonction contenant cette boucle depuis le programme principal j'ai pas de problème.

    Si maintenant je fais un

    T1 = CreateThread(NULL,32,threadfunc,NULL,1,NULL);
    ResumeThread(T1);

    et que dans la fonction threadfunc j'appel la fonction comprenant la boucle précédente, j'ai une erreur indiquant que la fonction CheckSynchronize et appelée depuis un autre Thread que le Thread principal.

    Si j'enlève le CheckSynchronize je ne reçois plus l'événement ComPortRxChar et par conséquent je ne peux plus faire une lecture AsynChrone, je suis obligé d'attendre une certain temps et d'aller voir si des caractères sont reçus.

    J'ai essayer d'autre méthode pour la déclaration du Thread et en fait j'aimerais savoir si on peut déclarer un Thread qui peut appeler la méthode CheckSynchronize.

    Voila j'espère que c'est plus clair.

    Merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Question 2
    Bonjour,

    Alors apparement, ma question sur l'appel de la méthode CheckSynchronize depuis un thread qui n'est pas le thread principal n'inspire pas grand monde, j'en conclu que ça n'est pas possible.

    Par contre si je reprend ma deuxième question

    est ce qu'il est possible de trapper un événement windows depuis un thread qui n'est pas le thread principal ?

    themadmax m'a répondu
    Pour ce qui est de la deuxième question c non, pas possible directement

    J'en conclu qu'on peut le faire indirectement.

    Indirectement à mon avis ça veut dire : trapper l'événement dans le thread principal et aprés créer un nouvelle évément depuis depuis le thread principal et aprés trapper ce nouvel événement dans le 2ième thread.

    Est ce que c'est juste ?

    Si oui est ce que quelque un a déjà fait ça ?

    Sinon comment est ce qu'on peut faire indirectement ?

  5. #5
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Désoler pour le temps de reponse.
    En effet si tu veut "catcher" un message windows ailleur que dans ta boucle de gestion des messages, tu peux faire une syncronisation de thread.
    Donc dans ta gestion des message tu peux lever un evenement, qui liberera ton autre thread. Il te faudra surment aussi une variable d'echange de message (attention si tu ecrit dedans avec tes deux threads il te faut une protection).
    Si tu as des pb pour implementer cela, post ton code. Et cette fois dans les balise CODE !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Utilisation de Synchronize
    Bonjour,

    Alors ce que je comptais faire c'est une classe d'accés au port com appelé DeviceAccess qui serait dériver de TThread

    Définition de la classe

    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
    class DeviceAccess : public TThread
    {
     
    	private:
     
    	GNModule* Module;
    	char* PLCFunction;
     
    	protected:
    	void __fastcall Execute();
    	void __fastcall ReadOnDevice();
     
    	public:
    	__fastcall DeviceAccess();
    };
    Et la fonction ReadOnDevice

    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
     
    void __fastcall DeviceAccess::ReadOnDevice()
    {
     
       Ecriture sur le port, avec réponse du device   
     
       while('Rien reçu sur le port com' && i<15)
       {
     
        j=0;
        i++;
        Application->ProcessMessages();
        while(!CheckSynchronize(10) && j<5)
        {
     
            j++;
     
        }
        Sleep(100);
     
       }
    }
    Et dans la fonction Execute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall DeviceAccess::Execute()
    {
    	Synchronize(&ReadOnDevice);
    }
    De cette manière, si j'ai bien compris, l'écriture et la lecture sur le port com s'effectuerais depuis le thread principal. Est ce que c'est juste ?

    Le problème que j'ai, c'est que je fais une DLL qui n'est pas de type VCL, j'utilise Borland Developper Studio 2006 et quand je compile, j'ai l'erreur :

    [Lieur Erreur] Error: Externe '__tpdsc__ Classes::TThread' non résolu référencé par C:\Projet1\DEVICEACCESS.OBJ

    J'ai essayé de faire include de VCL.h et de Classes.hpp et ça ne marche pas mieux.

    Est ce que quelqu'un sait si je dois faire un include pour que ça compile ?

    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    C'est du Borland ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    Effectivement c'est du borland. J'ai peut être pas poser la question au bon endroit.

    Mais alors je sais pas comment faire pour déplacer le message

  9. #9
    screetch
    Invité(e)
    Par défaut
    http://msdn.microsoft.com/en-us/libr...46(VS.85).aspx

    tu peux attrapper tes messages dans un thread, et les reposter dans un second thread qui a sa propre fonction d'attente de message.

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/10/2008, 10h07
  2. [WinAPI C++] MultiThreading et PostMessage
    Par Gruik dans le forum Windows
    Réponses: 7
    Dernier message: 29/03/2004, 15h58
  3. [WinAPI C++] MultiThreading?
    Par Gruik dans le forum Windows
    Réponses: 2
    Dernier message: 25/03/2004, 00h08
  4. [Win32]App multithread
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 25/09/2003, 09h57
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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