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

Lazarus Pascal Discussion :

Traduction d'un code Delphi en Lazarus [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut Traduction d'un code Delphi en Lazarus
    Bonjour,

    Indy 10.6 : TThread.Synchronize de l'unité IdSync.pas.
    Comment peut-on traduire ce bout de code Delphi en Lazarus ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TThread.Synchronize(nil,
          Procedure
          begin
            LoadPictureFromMemoryStream(imDst.Picture, ms);
          end);
    Merci. Cordialement. AD

  2. #2
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    ...Pour l'instant, la seule option que j'entrevois est de dériver la procedure DoSynchronize; de TidSync... à moins que je passe à côté de quelque chose. Mais le synchronize en lazarus n'utilise que les procédures statiques.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    ...Cela semble être une approche fonctionnelle :
    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
    uses
      ..., IdSync  in 'C:\lazarus32\components\Indy10_5410\Lib\Core\IdSync.pas';
     
    type
      TcIdSync = class(TIdSync)
      protected
        procedure DoSynchronize; override;
      public
        SourceStream:  TMemoryStream;
        Picture:       TPicture;
        procedure LoadPictureFromStream(Picture: TPicture; SourceStream: TMemoryStream);
      end;
    procedure TcIDSync.DoSynchronize;
    begin
       LoadPictureFromStream(Picture, SourceStream);   
    end;
     
    procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
    var
      ms:   TMemoryStream;
      sync: TcIdSync;
    begin
      ms := TMemoryStream.Create;
      try
        AContext.Connection.IOHandler.LargeStream := true;
        AContext.Connection.IOHandler.ReadStream(ms);
        {α Remplacement de l'appel de la procedure statique  }
        sync := TcIdSync.Create;
        try
          sync.SourceStream := ms;
          sync.Picture      := Dest.Picture;
          sync.Synchronize;
        finally
          sync.Free;
        end;
        {ω Remplacement de l'appel de la procedure statique  }
      finally
        ms.Free;
      end;
    end;
    Je suis évidemment preneur d'une autre solution. Cordialement. AD

  4. #4
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Salut
    As tu essayé depasser une fonction en paramètre comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure DoMySync(myvar:byte);
    begin
    ....
    end;
     
     
    TThread.Synchronize(nil,@DoMySync(MyNewVarInit));

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut
    As tu essayé depasser une fonction en paramètre comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure DoMySync(myvar:byte);
    begin
    ....
    end;
     
     
    TThread.Synchronize(nil,@DoMySync(MyNewVarInit));

    Bonjour BeanzMaster,

    Non cela fonctionne pas. Ce code fonctionnerait en Lazarus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure DoMySync();
    begin
    ....
    end;
     
    TThread.Synchronize(nil,@DoMySync);
    // RLebeau 6/7/2016: there are race conditions if multiple threads call
    // TThread.Synchronize() on the same TThread object at the same time
    // (such as this unit's GNotifyThread object)...
    {$IFDEF HAS_STATIC_TThread_Synchronize}
    // Fortunately, the static versions of TThread.Synchronize() can skip the
    // race conditions when the AThread parameter is nil, so we are safe here...
    TThread.Synchronize(nil, SyncProc);
    {$ELSE}
    // However, in Delphi 7 and later, the static versions of TThread.Synchronize()
    // call the non-static versions when AThread is not nil, and the non-static
    // versions are not even close to being thread-safe (see QualityPortal #RSP-15139).
    // They share a private FSynchronize variable that is not protected from
    // concurrent access.
    Extrait des commentaires de IdSync.pas (10.6)

    En Lazarus cela ne fonctionne pas sans le nil (ou autre) sinon
    unit1.pas(82,43) Error: Wrong number of parameters specified for call to "Synchronize"
    Cordialement. AD.

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Salut

    Dans Classesh.inc on peux trouver : class procedure Synchronize(AThread: TThread; AMethod: TThreadMethod);

    A tester

    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
    type
      TcIdSync = class(TIdSync)
      protected
        procedure DoSynchronize; override;
      public
        SourceStream:  TMemoryStream;
        Picture:       TPicture;
        procedure LoadPictureFromStream(Picture: TPicture; SourceStream: TMemoryStream);
      end;
     
    procedure TcIDSync.DoSynchronize;
    begin
       LoadPictureFromStream(Picture, SourceStream);   
    end;
     
    procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
    var
      ms:   TMemoryStream;
      sync: TcIdSync;
    begin
      ms := TMemoryStream.Create;
      try
        AContext.Connection.IOHandler.LargeStream := true;
        AContext.Connection.IOHandler.ReadStream(ms);
        {α Remplacement de l'appel de la procedure statique  }
        sync := TcIdSync.Create;
        try
          sync.SourceStream := ms;
          sync.Picture      := Dest.Picture;
          Synchronize(Sync,@DoSynchronize); // ---> soit comme ca
        finally
          sync.Free;
        end;
        {ω Remplacement de l'appel de la procedure statique  }
      finally
        ms.Free;
      end;
    end;
    Soit si la class(TIdSync) est de type TThread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type
      TcIdSync = class(TIdSync)
      protected
         FMonImage : TMonImage;
    .......
    procedure TcIDSync.DoSynchronize;
    begin
       Synchronize(@FMonImage.LoadPictureFromStream(Picture, SourceStream));   
    end;

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

Discussions similaires

  1. [Lazarus] Passage d'un code Delphi en Lazarus
    Par JP.NUAGE dans le forum Lazarus
    Réponses: 5
    Dernier message: 28/01/2014, 17h25
  2. [Langage/Algorithme] probleme de traduction code Delphi vers C++
    Par blondelle dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/05/2013, 15h27
  3. Traduction d'un code en C++ vers Delphi
    Par saidus dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2007, 16h55
  4. Réponses: 2
    Dernier message: 26/07/2007, 18h44
  5. Delphi versus Lazarus
    Par fabien25 dans le forum EDI
    Réponses: 1
    Dernier message: 20/06/2005, 12h44

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