AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Synchronize Fragen

Ein Thema von Glados · begonnen am 10. Jul 2017 · letzter Beitrag vom 13. Jul 2017
Antwort Antwort
Glados
(Gast)

n/a Beiträge
 
#1

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 09:39
Kann man also festhalten Queue ist besser als Synchronize?
Zitat:
Für das Setzen eines Hints oder eine Fortschrittsanzeige ist diese Synchronizität aber gar nicht notwendig
Heißt das, ich kann FormX.ProgressBarY.Position := in einem Thread ohne Synchronize aufrufen und komplett auf Queue ausweichen?

Verstehe ich das richtig?
Synchronize synchronisiert sofort und erst wenn das fertig ist geht es nach meinem Befehl, der in Synchronize() steht weiter
und Queue packt den Aufruf in eine ART Stack, es geht aber sofort weiter?

Nur kann Queue dann nicht Probleme machen wenn man folgendes Szenario hat?

Delphi-Quellcode:
var i: Integer;

i := 2;

TThread.Queue(nil, procedure begin i := 5; end);

if i = 5 then
 begin
 end;
Könnte es denn jetzt passieren, dass i := 5 ins Queue gesetzt wird aber erst so spät ausgeführt wird, dass if i := 5 nicht zutrifft, da i ja noch 2 ist?
Oder denke ich hier falsch?

Geändert von Glados (10. Jul 2017 um 09:50 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 09:48
Richtig, Queue() ist asynchron, Synchronize() ist synchron (höhö)

PS: Doch, genau in dem Fall willst du ganz sicher NICHT einen asynchronen Aufruf verwenden. Denn das Setzen auf fünf passiert praktisch garantiert NACH deiner Abfrage.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#3

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 09:49
Könnte mein oben genanntes Problem denn eintreten?
i := 5 ist nur ein Beispiel.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:19
Du hast zwei Möglichkeiten: Synchron (TThread.Synchronize(..) ) und asynchron (TThread.Queue(..) )

Wenn du die Auswirkungen/Resultate/Rückgaben des Codes den du im Kontext eines anderen Threads ausführen möchtest direkt brauchst, dann brauchst du TThread.Synchronize(..)
Das "Problem" wird garantiert auftreten, hier noch einmal das gleiche Beispiel, nur etwas ausführlicher:
Delphi-Quellcode:
procedure TForm17.Button1Click(Sender: TObject);
begin
   TThread.CreateAnonymousThread(
      procedure()
      var
         capturedVariable: Integer;
      begin
         capturedVariable := 100;
         TThread.Queue(
            nil,
            procedure()
            begin
               capturedVariable := 42;
            end
         );

         case capturedVariable of
            100:
               Beep();
            42:
               begin
                  Beep();
                  Beep();
               end;
         else
            Beep(); Beep(); Beep();
         end;
      end
   ).Start();
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.363 Beiträge
 
Delphi 12 Athens
 
#5

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:22
SendMessage und PostMessage synchronisieren sich selbstständig,
die Messages werden im Erstellungsthread der Komonenten verarbeitet, also innerhalb der MessageLoop. (bei der VCL im Hauptthread).

PostMessage ist asynchron (ist wie Queue)
SendMessage ist synchron (wie Synchronize)

Achtung: TThread.Queue im Haupthtread aufgerufen ist synchron, also wie Synchronize (k.A. wer da auf diese schwachsinnige Idee gekommen ist)
[edit] Seit wann gibt es ForceQueue?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Jul 2017 um 10:25 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:28
Seit 10.1 Berlin
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#7

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:30
Zitat:
Das "Problem" wird garantiert auftreten, hier noch einmal das gleiche Beispiel, nur etwas ausführlicher:
Danke für das Beispiel. Dann werde ich Queue nur da anwenden, wo ich die Daten nicht sofort brauche (das heißt GUI-Änderungen und keine Variablen die ich unmittelbar nach dem Queue brauche).

Zitat:
SendMessage und PostMessage synchronisieren sich selbstständig,
Woran kann das den liegen, dass sich hier rein gar nichts tut? Laut diesem Beitrag soll es ja angeblich funktionieren https://www.entwickler-ecke.de/topic..._106970,0.html
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.363 Beiträge
 
Delphi 12 Athens
 
#8

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:35
CriticalSection
MultiReaderSingleWriter
Interlocked


Interlocked: Setzen von Integer, Booleans (LongBool) usw., also allem mit "4 Byte", bzw. in Registergröße.
Delphi-Referenz durchsuchenInterlockedIncrement/MSDN-Library durchsuchenInterlockedIncrement, InterlockedDecrement, InterlockedExchange, ..., bis hin zu Assembler (LOCK)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#9

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:37
Zitat:
CriticalSection
MultiReaderSingleWriter
Interlocked
Ich verstehe nicht, was das jetzt mit SendMessage und der ProgressBar zu tun hat.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Thread Synchronize Fragen

  Alt 10. Jul 2017, 10:39
Woran kann das den liegen, dass sich hier rein gar nichts tut? Laut diesem Beitrag soll es ja angeblich funktionieren https://www.entwickler-ecke.de/topic..._106970,0.html
Ich habe das jetzt nicht alles gelesen, aber das hier scheint für mich bestens zu funktionieren:
Delphi-Quellcode:
unit Unit17;

interface uses
   System.SysUtils, System.Classes,
   Winapi.Windows,
   Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.ComCtrls;

type
   TMyThread = class(TThread)
      protected var
         progressbarHandle: THandle;
      protected
         procedure Execute(); override;
      public
         constructor Create(const progressbarHandle: THandle);
    end;

   TForm1 = class(TForm)
      ProgressBar1: TProgressBar;
      Button1: TButton;
      procedure Button1Click(Sender: TObject);
   end;

var
   Form1: TForm1;

implementation uses Winapi.CommCtrl;

{$R *.dfm}

{ TMyThread }

constructor TMyThread.Create(const progressbarHandle: THandle);
begin
   inherited Create(True);
   self.progressbarHandle := progressbarHandle;
end;

procedure TMyThread.Execute();
var
   percentDone: Integer;
begin
   percentDone := 0;

   while (not Terminated) do
      begin
         Inc(percentDone, 1);

         PostMessage(progressbarHandle, PBM_SETPOS, percentDone, 0);
         if (percentDone < 100) then
            TThread.Sleep(100)
         else
            Terminate();
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   myThread: TMyThread;
begin
   myThread := TMyThread.Create(ProgressBar1.Handle);
   myThread.FreeOnTerminate := True;
   myThread.Start();
end;

end.

Bonuspuntke für mehrmaliges Drücken des Buttons
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz