AGB  ·  Datenschutz  ·  Impressum  







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

VCL not thread save

Ein Thema von stahli · begonnen am 6. Mär 2014 · letzter Beitrag vom 8. Mär 2014
Antwort Antwort
Seite 3 von 3     123   
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: VCL not thread save

  Alt 7. Mär 2014, 11:04
Aber vor dem TThread.Synchronize oder 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?
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#22

AW: VCL not thread save

  Alt 7. Mär 2014, 12:01
Hallo Stahli,

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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#23

AW: VCL not thread save

  Alt 7. Mär 2014, 12:02
Aber vor dem TThread.Synchronize oder 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 Synchronize nicht aus dem Haupt-Thread auf. Dies kann zu einer Endlosschleife führen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: VCL not thread save

  Alt 7. Mär 2014, 12:12
Vermutlich ein Bug, bezüglich auf sich selber warten und so.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#25

AW: VCL not thread save

  Alt 8. Mär 2014, 12:31
Vermutlich ein Bug
Nicht alles, was nicht so funktioniert wie du willst, ist gleich ein Bug
Insbesondere dann nicht, wenn das Verhalten dokumentiert/by-design ist. Wenn dir die API nicht gefällt, ist das eine andere Sache.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#26

AW: VCL not thread save

  Alt 8. Mär 2014, 18:40
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 19:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz