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

Langage Delphi Discussion :

Probleme synchronize et semaphore


Sujet :

Langage Delphi

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut Probleme synchronize et semaphore
    Salut , tout le monde , voila un problème étrange qui survient dans mon application.

    En effet quand j'utilise le sémaphore la fonction synchronize ne produit aucun effet et n'affiche rien. Alors que si je commente toutes le lignes relatives au sémaphore , ça marche parfaitement.

    Qu'est ce que j ai loupé ??

    Code du thread Principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Semaphore_Bdechargement:=CreateSemaphore(nil,1,1,'Semaphore_Bdechargement'); 
     Event_Bdechargement_init:=Tevent.create(nil,false,false,'Bdechargement_init');
     //Construction du thread
      barillet_dechargement:=TBarillet_dechargement.Create;
      //on lance le thread 
      barillet_dechargement.Resume;
      Waitforsingleobject(Semaphore_Bdechargement,infinite);
      Event_Bdechargement_init.SetEvent;
      Waitforsingleobject(Semaphore_Bdechargement,infinite);
      ReleaseSemaphore(Semaphore_Bdechargement,1,nil);
    Code du thread secondaire:
    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
    constructor TBarillet_dechargement.Create;
    begin
      FreeOnTerminate:=false;
      threadterminated:=false;
      inherited Create(true);  
      FEvent_Bdechargement_init:=Tevent.create(nil,False,False,'Bdechargement_init');
      //Ouverture du sémaphore pour déclarer la fin d'utilisation de la ressource
      FSemaphore_Bdechargement:=OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,'Semaphore_Bdechargement');
    end;
     
    procedure Tbarillet_dechargement.Affiche_panel;
    begin
     Form_pp.panel1.caption:='salut';
    end;
     
    procedure Tbarillet_dechargement.Execute;
    begin
      while not(Threadterminated) do
      begin
        //on attend l'évenement de l'initialisation de la ressource
        if FEvent_Bdechargement_init.WaitFor(0)=wrSignaled then
        begin
          synchronize(Affiche_panel);
          //on libère le sémaphore pour signaler que la fin d'utilisation du barillet
          ReleaseSemaphore(FSemaphore_Bdechargement,1,nil);
        end;
    end;

  2. #2
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Ok bon , beh j ai trouvé la solution pour ceux que cela intéresse.
    En fait Synchronize, comme son nom l'indique sert à se synchroniser avec le thread principal. Or dans mon cas j'utilise la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Waitforsingleobject(Semaphore_Bdechargement,infinite);
    Cette fonction est bloquante puisque elle a pour paramètre Infinite, donc le synchronize ne peut aboutir.

    La solution est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while Waitforsingleobject(Semaphore_Bdechargement,10)<>WAIT_OBJECT_0 do
        application.processmessages;
    end;

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

Discussions similaires

  1. Probleme semaphore+files de message
    Par ludo86 dans le forum C
    Réponses: 0
    Dernier message: 16/12/2007, 17h04
  2. probleme avec synchronized,wait
    Par lexu1213 dans le forum Langage
    Réponses: 3
    Dernier message: 23/07/2007, 09h34
  3. probleme de synchronization
    Par nevroo dans le forum Langage
    Réponses: 10
    Dernier message: 03/11/2006, 09h11
  4. Probleme Avec Les Semaphores
    Par vbcasimir dans le forum Oracle
    Réponses: 4
    Dernier message: 05/07/2006, 12h04
  5. [Thread][SYNCHRONIZED] problème de synchornisation
    Par _Eric_ dans le forum Général Java
    Réponses: 9
    Dernier message: 15/03/2005, 10h59

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