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 1 von 2  1 2      
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, 15:54
Die Anzeige informieren, dass sich etwas verändert hat und die Anzeige holt dann (sobald es möglich ist) die neuen Werte und stellt diese dar.

Der UI-Thread sollte eigentlich fast immer schlafen (idle) und nur kurz aufleben um neue Informationen anzuzeigen oder Eingaben vom User entgegennehmen und diese dann weiterreichen.

Idealerweise müsste der Business-Layer (allgemeiner: alles was nicht zu UI gehört) im eigenen Thread-Kontext laufen, was aber in den meisten Fällen nicht passiert, da sich die Laufzeit der Aktionen meistens auf ein paar Millisekunden beschränkt (wenn überhaupt messbar) und ein eigener Thread-Kontext wäre dort mit Kanonen auf Spatzen schießen.

Somit werden sich nur die langwierigen Abläufe herausgepickt und diese werden in einen separaten Thread-Kontext verschoben.

Zurück zu deinem Beispiel mit der Schleife:
Die Schleife gehört in einen eigenen Thread und die Werte in ein Daten-Objekt. Das UI wird informiert, dass sich die Daten geändert haben und dann entscheidet das UI wann genau es diese neuen Informationen abruft und darstellt (ASAP oder maximal alle x Millisekunden).

Die meisten Programmier-Anfänger haben allerdings vor dem Start ihrer Karriere auch das Prinzip des UI nicht verstanden bzw. sich darüber keinen Kopf gemacht (ich möchte mich dort unbedingt eingeschlossen wissen). Daher auch diese "Fehler", denn es passiert etwas anderes als man erwartet hat. Es passiert aber nun mal genau das, was man programmiert hat. Diese Erwartungshaltung rührt aber von Unwissenheit her, und das schützt nun mal nicht vor der Strafe
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 sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: VCL not thread save

  Alt 6. Mär 2014, 16:11
Die Synchronize - Methode von TThread kann man in neuen Delphi Versionen auch mit einer Closure aufrufen.
Dazu ein interessanter Artikel von Uwe Rabe:
http://www.uweraabe.de/Blog/2011/01/...th-parameters/
Ich denke das ist der Weg den man gehen muss da man die VCL selbst nicht ändern kann.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: VCL not thread save

  Alt 6. Mär 2014, 20:13
Die Synchronize - Methode von TThread kann man in neuen Delphi Versionen auch mit einer Closure aufrufen.
Dazu ein interessanter Artikel von Uwe Rabe:
http://www.uweraabe.de/Blog/2011/01/...th-parameters/
Wobei das hier Einige () auch schon vor 2011 gemacht haben.

Denn das ist eigentlich sogar eine der wenigen "einfachen" Möglichkeiten Parameter "threadsicher" an den Zielthrad zu übergeben.
(ohne sich eine threadsichere globale Variable anzulegen, oder gar gleich eine ganze Liste, wenn diese Methode aus mehreren Threads gleichzeitig aufgerufen werden könnte)

Delphi-Quellcode:
// innerhalb von TThread.Execute
Synchronize(procedure
  begin
    CallMyProgress(PercentComplete);
  end);
Delphi-Quellcode:
// in Threads, die nicht von TThread abstammen oder wo man auf die TThread-Instanz keinen Zugriff hatte.
TThread.Synchronize(nil, procedure
  begin
    CallMyProgress(PercentComplete);
  end);
Wobei man ja mindestens seit XE3 sich eine Pseudoinstanz des eigentlichen TThreads oder gar eine Instanz für etwas, daß dein TThread ist, erstellen lassen kann.
Ich glaub das ging mit TThread.CurrentThread, oder so.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 6. Mär 2014 um 20:15 Uhr)
  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
 
#4

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

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

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).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#6

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
535 Beiträge
 
Delphi 11 Alexandria
 
#7

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
 
#8

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

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

AW: VCL not thread save

  Alt 7. Mär 2014, 11:12
Vermutlich ein Bug, bezüglich auf sich selber warten und so.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

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

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
Antwort Antwort
Seite 1 von 2  1 2      


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 01:00 Uhr.
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