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 397
    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 397
    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