TThread - Queue mit Anonymer Methode -> CBuilder-Entsprechung?



  • Hallo zusammen.

    Seit dem 2009er-Release des C++ Builders gibt es ja für Synchronize und Queue in TThread die Überladung
    _di_TThreadProcedure AThreadProc,
    die anonyme Methoden einsetzt.

    Ich möchte diese nutzen, um per Queue Daten aus einem Thread an den VCL-Thread zur Anzeige zu übergeben, um keine Critical Sections nutzen zu müssen.
    Für Object Pascal gibt es hierzu einige Beispiele, z.B.

    procedure TSortThread.VisualSwap(A, B, I, J: Integer);
    begin
      Synchronize(procedure
       begin
         with FBox do
         begin
           Canvas.Pen.Color := clBtnFace;
           PaintLine(Canvas, I, A);
           PaintLine(Canvas, J, B);
           Canvas.Pen.Color := clRed;
           PaintLine(Canvas, I, B);
           PaintLine(Canvas, J, A);
         end;
       end);
    end;
    

    auf http://blogs.embarcadero.com/abauer/2008/09/08/38868

    oder auf der Delphi-Seite von Uwe Raabe
    http://www.uweraabe.de/Blog/2011/01/30/synchronize-and-queue-with-parameters/

    Leider werde ich nicht ganz schlau draus, wie ich das ganze im C++ Builder (XE2) umsetzen kann und habe leider auch noch keine Beispiele gefunden. Gibt es hier die Entsprechung für anonyme Methoden?

    Hat eventuell jemand ein Quellcode-Beispiel für die Übergabe von Werten an den VCL-Thread mit anonymen Methoden und der Queue-Methode für C++?

    Gruß,
    F. Koch



  • Anonyme Methoden gibt es in C++ nicht, und das Analogon Lambda-Expressions unterstützt der C++Builder noch nicht. Aber du kannst dir trotzdem ähnlich komfortabel abhelfen, indem du nämlich von der Klasse TCppThread erbst, die ich hier gepostet habe. Dann hast du eine Methode namens SynchronizeCall() , der du die aufzurufende Funktion und die Argumente übergeben kannst. Die Funktion führt dann Synchronize() aus, ruft im Hauptthread deine Funktion auf, speichert ggf. den Rückgabewert und gibt in an den Aufrufer weiter.

    Ein Beispiel dazu findest du im verlinkten Post.

    Edit: ich vergaß zu erwähnen, daß mein Code nur SynchronizeCall() enthält - aber du kannst völlig analog dazu auch ein QueuedCall() implementieren. Vielleicht erweitere ich den Code auch mal gelegentlich selbst.



  • Vielen Dank für die Antwort.
    Hat mir sehr weitergeholfen. 🙂


Anmelden zum Antworten