AGB  ·  Datenschutz  ·  Impressum  







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

TThread.Synchronize

Ein Thema von Der schöne Günther · begonnen am 14. Mär 2013 · letzter Beitrag vom 15. Mär 2013
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: TThread.Synchronize

  Alt 15. Mär 2013, 07:37
Vielen Dank für die Antworten!

Wichtig ist hierbei auch der Blick in die Dokumentation TThread.Synchronize.
Zitat von TThread.Synchronize:
Führt einen Methodenaufruf im Haupt-Thread aus.
Also egal von wo auch immer das ausgeführt wird, es wird synchron zum Hauptthread ausgeführt.
Wenig später heißt es jedoch:
Zitat:
Hinweis: Wenn Sie die statische Version der Methode Synchronize mit nil/NULL als der erste Parameter verwenden, wird die von AMethod referenzierte Methode im Haupt-Thread synchronisiert.
Das hatte ich bislang so interpretiert, als könnte ich mit der gleichnamigen Klassenmethode angeben, von welchem Thread aus der Aufruf tatsächlich stattfindet. Denn wozu gebe ich einen Thread sonst überhaupt als Parameter an?

Wichtig ist hier, das Synchronize so lange wartet, bis der Hauptthread sich drum kümmern kann. Es geht also Zeit flöten.
Gut (und beruhigend) zu wissen. Aber gerade hier beschleicht mich jetzt das Gefühl, dass ich meinen TThread noch mit irgendwas hätte ausstatten müssen, um darauf überhaupt (und auch wo) zu reagieren - Eine Art kümmereDichUmSynchronize-AufrufeVonAnderenThreads() .


Um kritische Abschnitte gibt es dann wohl wieder keinen Weg drum herum, ich möchte nicht, dass die Funktion "von außen" aufgerufen/angefordert wird, wenn der Thread selbst auch gerade in dieser Funktion wühlt. Jetzt bin ich mal gespannt, was TCriticalSection bereithält...
  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
 
#2

AW: TThread.Synchronize

  Alt 15. Mär 2013, 07:48
Was soll Delphi-Referenz durchsuchenTCriticalSection schon bereithalten?

Betreten oder Versuchen zu betreten, Verlassen that's all
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
Der schöne Günther

Registriert seit: 6. Mär 2013
6.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: TThread.Synchronize

  Alt 15. Mär 2013, 08:05
Und es funktioniert sogar, der Tag ist gerettet.

Im Endeffekt bin ich zwar immer noch etwas ratlos, was für konkrete Vorteile es mir bringt, nicht direkt über die WinAPI zu gehen, aber das wird sich sicher noch zeigen.

Geändert von Der schöne Günther (15. Mär 2013 um 08:09 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: TThread.Synchronize

  Alt 15. Mär 2013, 08:33
Ich bin von Synchronize mittlerweile ganz weg. Wenn ich im Thread API Ressourcen brauche erstelle ich sie mir dort (nicht als Kompo auf dem Formular z.B.), Threads teilen sich nur via PostMessage mit, und haben Properties deren Getter und Setter mit jeweiligen Critical Sections versehen sind. Zwar wimmelt es in der Thread-Methode je nach Fall von CS.Enter; try ... finally CS.Leave; end; , aber so muss das Hauptprogramm nachher nicht mehr machen, als die Messages zu emfangen und kann einfach so auf den Feldern des Threads agieren. (Üblicherweise dann Work-Queues und erweiterte Status-Objekte o.ä.)

Ist etwas mehr Tipperei, aber seit ich das so durchziehe habe ich nie wieder einen Thread gegen die Wand fahren lassen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: TThread.Synchronize

  Alt 15. Mär 2013, 09:03
Zwar wimmelt es in der Thread-Methode je nach Fall von CS.Enter; try ... finally CS.Leave; end; , ...
Und das sollte -der Lesbarkeit wegen- in kleine lokale Prozeduren oder private Methoden ausrefaktorisiert werden, dann wimmelt es nicht mehr so und... das Ganze gewinnt einen Preis für sauberen Code
  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
 
#6

AW: TThread.Synchronize

  Alt 15. Mär 2013, 09:17
Zwar wimmelt es in der Thread-Methode je nach Fall von CS.Enter; try ... finally CS.Leave; end; , ...
Und das sollte -der Lesbarkeit wegen- in kleine lokale Prozeduren oder private Methoden ausrefaktorisiert werden, dann wimmelt es nicht mehr so und... das Ganze gewinnt einen Preis für sauberen Code
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
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: TThread.Synchronize

  Alt 15. Mär 2013, 09:30
Kommt er mir hier mit Selbstverständlichkeiten ;P (Aber auch diese bekommen dadurch hie un doa etwas Verschachtelungstiefe dazu, wobei ich es meist so mache, dass ich in der CS ein Objekt aus der Liste in eine lokale Variable packe und es aus der Liste werfe. Die Verarbeitung geht dann ausserhalb der CS, sonst würde das doch arg blockieren. Setzt natürlich voraus, dass andere Threads nur die Queue anfassen, ein keinen Finger mehr auf den enthaltenen Objekten behält.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (15. Mär 2013 um 09:33 Uhr)
  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 10:09 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