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

EDI Delphi Discussion :

[Kylix] Multithreads la galère


Sujet :

EDI Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut Multithreads la galère
    bonjour j'ai un souci avec le multithreads.
    crétation d'objtes threads...
    Enfin bref quelqun peu m'aider et me donner un exemple .
    Et j'ai un problème pour donner à prioriy la valeur "tpIdle" il reconnait pas le symbole.
    Merci de m'aider :

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    donne nous ton code ( qui concernne seulement la création de thread ). Pour tplde, j'en sais rien mais va voir le tuto sur les thread de developpez.com

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut Voila
    Ceci est le début du thread car je n'ai pas avancer plus carj'ai une erreur avec tpIdle et je ne comprend pas pourquoi

    Thread.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
    #include <clx.h>
    #pragma hdrstop
     
    #include "Thread.h"
    #include "main.h"
    #include "CSerial.h"
    #pragma package(smart_init)
     
    //---------------------------------------------------------------------------
     
    //   Important : les méthodes et propriétés des objets de la CLX peuvent uniquement être
    //   utilisées dans une méthode appelée en utilisant Synchronize, comme :
    //
    //      Synchronize(&UpdateCaption);
    //
    //   où UpdateCaption pourraît être de la forme :
    //
    //      void __fastcall TMonThread::UpdateCaption()
    //      {
    //        Form1->Caption = "Mis à jour dans un thread";
    //      }
    //---------------------------------------------------------------------------
     
    __fastcall TMonThread::TMonThread(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
            Priority = tpIdle;   // priorité basse
            FreeOnTerminate=true;
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TMonThread::Execute()
    {
            //---- Placer le code du thread ici ----
     
            //libération automatiquement
    }

    Thread.h //créé automatiquement


    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
    #ifndef ThreadH
    #define ThreadH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
     
     
    class TMonThread : public TThread
    {            
    private:
    protected:
            void __fastcall Execute();
    public:
            __fastcall TMonThread(bool CreateSuspended);
    };
    //---------------------------------------------------------------------------
    #endif
    je ne sais pas trop quoi car là je me sers du bouquin kylix mais c'est pas très clair et çà ne dis pas koi inclure.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    il me semble d'après l'aide de kylix que les priorité sous linux sont des nombres entiers. J'ai déjà essayé, ça marche avec zero mais avec un nombre supérieur à zero, ça marchais pas. J'ai pas insisté par la suite. Une chose encore , la configuration du thread, je préfère la faire avant son exécution ( j'ai eu des trucs bizzard aussi ), cad rien dans le constructeur du thread et lors de la création du thread dans le thread principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Monthread * thread = new Monthread ( true ) ; //le thread est suspendu
     
    thread->Priority = 0 ;
     
    thread->FreeOnTerminate = ... ;
     
    thread->OnTerminate = & TaFonction ; //exécutée avant fin thread
     
    //...
     
    thread->Resume () ; //le thread s'exécute.

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut re
    Ok merci mais je t'assure que pour mettre en priorité la plus basse il y a marqué qu'il faut mettre tpIdle mais çà marche pas.


    es tu convaincu que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    thread->OnTerminate = & TaFonction ; //exécutée avant fin thread
    soit nécessaire ?a quoi cela va me servir exactement ? si il n'y a que 1 fonction est ce nécessaire ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    OnTerminate n'est pas necessaire pour les priorité. Mais ça peut être utile, regarde l'aide. J'ai juste fait un copier coller d'un de mes sources. Pour tpIdle, je sais pas, mais je doute que cela existe sous linux, enfin ...

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut heu
    J'ai instancié le threads dans mon "main"

    hé bien là j'ai compris mais le problème c'est que je n'arrive pas à me servir des objets de mon programme principale :
    exemple: Tform1 et je voudrais accéder au bouton enregistrement

    Donc je voudrais faire dans le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Enregistrement->Click();
    Mais çà ne fonctionne pas je n'arrive pas à accéder aux objets. Une solution ? :

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut re
    J'ai instancié le threads dans mon "main"

    hé bien là j'ai compris mais le problème c'est que je n'arrive pas à me servir des objets de mon programme principale :
    exemple: Tform1 et je voudrais accéder au bouton enregistrement

    Donc je voudrais faire dans le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Enregistrement->Click();
    Mais çà ne fonctionne pas je n'arrive pas à accéder aux objets. Une solution ? :

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    Tu ne peux pas accéder aux objets CLX sans synchronisation entre le thread et le thread principale ( ton " main ") , mise à part certain ( voir la doc ). La méthode synchronize est là pour ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    void _fastcall MonThread::procedure () //necessairement sans argument
     
    { Form1->Enregistrement->Click () ; /*MonThread doit posséder un pt sur la forme possédant le bouton*/
      
    }
     
    quelque part dans la méthode execute : 
     
     
    Synchronize ( & procedure ) ; //execution de la méthode procedure synchronisée avec le thread principale.
    Un conseil, lit bien l'aide de kylix et surtout la doc sur la classe TThread.

    L'aide sous entend d'autres techniques, mais je ne les connais pas ( post de message, etc ... )

    Fais un tour sur le forum C++ Builder. A part les histoires de priorité qui sont dépendantes du sys tème exploitation, les thread sous kylix sont les même que sous C++ Builder.

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut mais heu...
    beh merci mais le problème c'est que Form1-> ne marche pas et je comprend pas pkoi pourtant j'ai inclu main.h

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    J'ai eu le même problème que toi au sujet du pointeur sur la Form principale ( Form1 ). Je l'ai résolu en ayant un pointeur attribut de classe du type de ta Form1 avec initialisation dans le constructeur, dans ta classe thread. Attention au inclusion mutuelle entre le .h de ton thread et le .h de ta Form ( il faut pour cela faire une déclaration à l'avance ).

    c'est vrai que kylix crée automatiquement un pointeur Form1 dans le .cpp de ta classe TForm1. Mais comme tu inclues le .h, il n'est pas accessible.

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut yo
    ok merci çà marche mon thread . mais leproblème c'est que j'ai l'impressionb qu'il y a très peu de temps qui lui est accordé par le processeur alors il a pas le temps de ce faire entièrement alors est ce que quelq'un connait la priorité normal du application pour que je le mette un peu en dessous (niveau priorité) ???

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    je sais pas désolé

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut bon alors
    Je suis mal parti car je ne sais comment réglé la priorité correctement car qd je met un autre truc que zero çà fait des erreurs dans tous les ens alors je comprend pas trop.

    Grosse déprime

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut suite à ceci....
    J'ai donc essayé d'aborder le sujet autrement n faisant par évènement mais la c la galère encore plus le programme plante. Il faut que je trouve le moyen de régler une priorité assez élevé quelqu'un sait ?

  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Hello
    En ce qui me concerne, j'avais le mm pb : je ne pouvais pas acceder a tous les elements que je voulais... J'ai trouve une parade infaillible : pthread_create !!!

    Tres simple d'utilisation :
    pthread_t *MonThread;
    MonThread = new pthread();
    pthread_create(MonThread,NULL,Function,(void*)Param);
    sleep(500);

    Et dans ta fonction, tu fais ce que tu veux que ton thread fasse...
    Param est un pointeur sur les parameter de ta fonction. Si tu fonction a besoin de plusieurs parameters, passe un pointeur sur une structure...

    J'insiste sur le sleep qui laisse le temps au thread de recopier les valeurs avant que tu ne quitte ta fonction...
    Je pense qu'il y a egalement de regler la priorite... A toi de voir, bon courage...
    Quand j'entend ce que j'entend et que je vois ce que je vois, il est normal de penser ce que je pense !

  17. #17
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Points : 22
    Points
    22
    Par défaut ah
    Le sleep est obligatoire pense tu vraiment ???

Discussions similaires

  1. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59
  2. [Kylix] Kylix / port serie
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 01/04/2002, 12h07
  3. [Kylix] Clé d'activation
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 27/03/2002, 23h19
  4. Réponses: 2
    Dernier message: 17/03/2002, 19h00
  5. [Kylix] Kylix ou KDevelop ?
    Par Saïd dans le forum EDI
    Réponses: 3
    Dernier message: 15/03/2002, 08h58

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