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
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: VCL not thread save

  Alt 6. Mär 2014, 20:49
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;
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
Online

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

AW: VCL not thread save

  Alt 6. Mär 2014, 23:19
Die Funktionen prüfen das eigentlich selber ab,
ABER für das Debuggen macht sich diese Prüfung besser.

Jedenfalls so weit ich das mitbekommen hab, in leidlichen Debugsessions.
Denn wenn es innerhalb des synchronisieren Codes eine Exception gibt, dann langes man gerne sonstwo in der CPU-Ansicht und noch schlimmer wird es, wenn man EurekaLog im Code hat (das muß dabei noch nichtmal aktiv sein).



Außer daß TThread.Queue im MainThread nicht unbedingt das macht, was ich ihm unterstellt hatte ... gibt es sonst keine Probleme (wenn es nicht kallt).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#3

AW: VCL not thread save

  Alt 7. Mär 2014, 07:45
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;
... und bevor man das macht, immer zuerst prüfen ob man sich in Delphi 2009 aufhält

Delphi TThread.CurrentThread and EAccessViolation

Bis 2009 war System.IsConsole geeignet und wird z.B. im Indy Telnet Client Quelltext (IdTelnet) verwendet, aber ab 2010 ist CurrentThread natürlich erste Wahl.
Michael Justin
  Mit Zitat antworten Zitat
taveuni

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

AW: VCL not thread save

  Alt 7. Mär 2014, 10: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
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: VCL not thread save

  Alt 7. Mär 2014, 11: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
Online

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

AW: VCL not thread save

  Alt 7. Mär 2014, 11: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
 
#7

AW: VCL not thread save

  Alt 8. Mär 2014, 11: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
 
#8

AW: VCL not thread save

  Alt 8. Mär 2014, 17: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


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 16:32 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