Verwirrung des Thread-Synchronisationsproblems

8

Es verwirrt mich, wenn ich heute den Artikel von Zarko Gajic lese:

" Abfragen von Multithread-Delphi-Datenbanken "

Artikel-URL: Ссылка

Sourecode: Ссылка

Mit dem Code der Prozedur "TCalcThread.Execute" Warum muss der folgende Code nicht in die Synchronize () -Methode zum Ausführen platziert werden?

%Vor%

Diese Codes arbeiten mit den VCL-Komponenten und beziehen sich auf die UI-Aktualisierungen. Nach meinem Wissen sollten diese Operationen Thread-Synchronisierung verwenden und vom Haupt-Thread ausgeführt werden. Ist mein Wissen der Fehler?

    
Leo 19.01.2010, 01:44
quelle

2 Antworten

18

Dies ist ein seltener Fall, in dem Sie davon profitieren, dass Windows die Thread-Synchronisierung für Sie durchführt. Der Grund dafür ist, dass für eine Listbox die Elemente mithilfe von SendMessage mit steuerspezifischen Nachrichten bearbeitet werden. Aus diesem Grund stellt jeder SendMessage-Aufruf sicher, dass die Nachricht von demselben Thread verarbeitet wird, für den das Steuerelement erstellt wurde, insbesondere vom Hauptthread.

Wie gesagt, das ist ein seltener Fall. Es verursacht auch einen Threadwechsel für jeden dieser drei Aufrufe, was die Leistung beeinträchtigt. Es ist immer noch besser, mit "Synchronisieren" zu verhindern, dass dieser Codeblock im Hauptthread ausgeführt wird, zu dem er gehört. Es stellt außerdem sicher, dass Sie nicht gebissen werden, wenn Sie mit einem Steuerelement arbeiten, das SendMessage nicht intern verwendet.

    
Allen Bauer 19.01.2010, 02:15
quelle
0

Tatsächlich. Möglicherweise ist das Beispiel nicht problematisch, da während der Ausführung des Threads keine Änderungen an der Benutzeroberfläche vorgenommen werden. Aber UI-Dinge müssen immer innerhalb des UI-Threads auftreten.

Die einzigen Unterschiede zwischen den synchronisierten und den nicht synchronisierten Anweisungen sind:

  • die nicht synchronisierten sind keine No-Params-Methoden, so dass das Programm schwieriger zu schreiben ist:)
  • Die sync'ed-Methode aktualisiert ein TLabel, das kein TControl ist (wenn ich mich an meine Delphi-Tage erinnere), so dass es Canvas direkt verwendet ...

Aber trotzdem: UI wird von einem einzigen Thread berührt. Immer. Sobald ich eine TTreeBox innerhalb eines Threads aktualisieren wollte (kein Paralelismus noch Cross-Updates, einfach ein separater Thread) und es war eine sehr schlechte Sache (zufällige Fehler) ...

    
helios 19.01.2010 01:54
quelle