Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Thread Synchronize Fragen (https://www.delphipraxis.net/193263-thread-synchronize-fragen.html)

Glados 10. Jul 2017 09:10

Thread Synchronize Fragen
 
Ich versuche seit ein paar Tagen meinen Thread zu optimieren, sodass ich ohne Synchronize arbeiten kann. Hierzu ein paar Fragen:

- muss ich das Setzen eines Tray-Icon-Hints synchronisieren?

- wie kann ich Position und Hint einer ProgressBar ohne Synchronize setzen?
Ich habe meinem Thread das Handle meiner ProgressBar übergeben und dann folgendes versucht
Delphi-Quellcode:
ProgressBarHandle:; THandle;
SendMessage(ProgressBarHandle, PBM_SETPOS, 55, 0);
Leider tut sich dabei exakt nichts! PostMessage funktioniert auch nicht.
Aktuell verwende ich
Delphi-Quellcode:
TThread.ForceQueue()
statt Synchronize.

Uwe Raabe 10. Jul 2017 09:39

AW: Thread Synchronize Fragen
 
Synchronize blockiert deinen Thread bis der Befehl abgearbeitet wurde. Für das Setzen eines Hints oder eine Fortschrittsanzeige ist diese Synchronizität aber gar nicht notwendig. Hier kannst du auch einfach
Delphi-Quellcode:
Queue
einsetzen, was deinen Thread eben nicht blockiert, sonst aber dasselbe macht.
Delphi-Quellcode:
ForceQueue
ist nur dann sinnvoll, wenn der Aufruf sowohl aus einem Neben- als auch aus dem Hauptthread erfolgen kann.

Glados 10. Jul 2017 09:39

AW: Thread Synchronize Fragen
 
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
Delphi-Quellcode:
i := 5
ins Queue gesetzt wird aber erst so spät ausgeführt wird, dass
Delphi-Quellcode:
if i := 5
nicht zutrifft, da i ja noch 2 ist?
Oder denke ich hier falsch?

Der schöne Günther 10. Jul 2017 09:48

AW: Thread Synchronize Fragen
 
Richtig,
Delphi-Quellcode:
Queue()
ist asynchron,
Delphi-Quellcode:
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.

Glados 10. Jul 2017 09:49

AW: Thread Synchronize Fragen
 
Könnte mein oben genanntes Problem denn eintreten?
i := 5 ist nur ein Beispiel.

Der schöne Günther 10. Jul 2017 10:19

AW: Thread Synchronize Fragen
 
Du hast zwei Möglichkeiten: Synchron (
Delphi-Quellcode:
TThread.Synchronize(..)
) und asynchron (
Delphi-Quellcode:
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
Delphi-Quellcode:
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;

himitsu 10. Jul 2017 10:22

AW: Thread Synchronize Fragen
 
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?

Der schöne Günther 10. Jul 2017 10:28

AW: Thread Synchronize Fragen
 
Seit 10.1 Berlin 8-)

Glados 10. Jul 2017 10:30

AW: Thread Synchronize Fragen
 
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

himitsu 10. Jul 2017 10:35

AW: Thread Synchronize Fragen
 
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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.
Seite 1 von 4  1 23     Letzte »    

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