Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi VCL not thread save (https://www.delphipraxis.net/179429-vcl-not-thread-save.html)

taveuni 7. Mär 2014 10:04

AW: VCL not thread save
 
Zitat:

Zitat von Sir Rufo (Beitrag 1251005)
Aber vor dem
Delphi-Quellcode:
TThread.Synchronize
oder
Delphi-Quellcode:
TThread.Queue
immer vorher prüfen ob man sich ausserhalb des MainThread-Kontext aufhält.
Delphi-Quellcode:
if MainThreadID <> TThread.CurrentThread.ThreadID then
  TThread.Synchronize(...)
else
  ...
end;

Warum? Geht da was kaputt wenn man in den eigenen Thread synchronisiert?

HeZa 7. Mär 2014 11:01

AW: VCL not thread save
 
Hallo Stahli,

Zitat:

Zitat von stahli (Beitrag 1250991)
Wie schon mal gesagt: Schade, dass da jeder sein eigenes Süppchen gekocht hat.
Meins köchelt jetzt eben auch noch...

Ich habe schon zuviel schlechten Threading-Code gesehen. Entweder wurden die Risiken der Threading Programmierung nicht vollständig berücksichtigt, was dann dazu führte, dass das Programm unvorhersehbar und unerklärlich merkwürdiges Verhalten zeigte oder aber es waren soviele Critical-Sections darin, dass man sich fragte warum überhaupt Threads verwendet werden.

Deswegen habe ich mir geschworen, dass ich vor dem nächten Projekt mit Threading, zu allererst die Fähigkeiten der OmniThreadLibrary auschecken werde.

Da hat ein echter Threading-Experte seit 2008 seine Wunsch-Library gebaut und (und das ist viel zu selten der Fall) sie auch dokumentiert. In dem Blog des Autors kannst du viel über die Entstehung der OmniThreadLibrary erfahren, aber auch über Threading allgemein.

Bevor als die eigene Suppe überbrodelt, würde ich mal die OmniThreadLibrary schmecken.

Ciao Heinz Z.

Sir Rufo 7. Mär 2014 11:02

AW: VCL not thread save
 
Zitat:

Zitat von taveuni (Beitrag 1251071)
Zitat:

Zitat von Sir Rufo (Beitrag 1251005)
Aber vor dem
Delphi-Quellcode:
TThread.Synchronize
oder
Delphi-Quellcode:
TThread.Queue
immer vorher prüfen ob man sich ausserhalb des MainThread-Kontext aufhält.
Delphi-Quellcode:
if MainThreadID <> TThread.CurrentThread.ThreadID then
  TThread.Synchronize(...)
else
  ...
end;

Warum? Geht da was kaputt wenn man in den eigenen Thread synchronisiert?

Delphi-Referenz durchsuchenTThread.Synchronize
Zitat:

Warnung: Rufen Sie
Delphi-Quellcode:
Synchronize
nicht aus dem Haupt-Thread auf. Dies kann zu einer Endlosschleife führen.

himitsu 7. Mär 2014 11:12

AW: VCL not thread save
 
Vermutlich ein Bug, bezüglich auf sich selber warten und so.

BUG 8. Mär 2014 11:31

AW: VCL not thread save
 
Zitat:

Zitat von himitsu (Beitrag 1251091)
Vermutlich ein Bug

Nicht alles, was nicht so funktioniert wie du willst, ist gleich ein Bug :stupid:
Insbesondere dann nicht, wenn das Verhalten dokumentiert/by-design ist. Wenn dir die API nicht gefällt, ist das eine andere Sache.

Namenloser 8. Mär 2014 17:40

AW: VCL not thread save
 
Kann da wirklich eine Endlosschleife auftreten oder meinen die eher ein Deadlock? Soweit ich weiß, sendet Synchronize eine Message an den Thread und wartet anschließendä vermutlich auf ein Signal (Lock). Wie eine Endlosscheife entstehen sollte, kann ich mir nicht so richtig vorstellen, Deadlock wäre dagegen logisch, weil die Message ja nicht abgearbeitet werden kann, während der Aufrufer-Thread blockiert.

Abgesehen davon meine ich aber mal den Source-Code von Synchronize gelesen zu haben, und wenn ich mich recht erinnere, war da am Anfang eine Weiche drin, die prüft ob GetCurrentThread = Ziel-Thread.

Kann natürlich sein, dass das erst in späteren Versionen in die RTL eingebaut wurde. Aber mindestens seit Delphi 2006 sollte es dann schon drin sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 Uhr.
Seite 3 von 3     123   

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