AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TThread.Syncronize und critical section
Thema durchsuchen
Ansicht
Themen-Optionen

TThread.Syncronize und critical section

Ein Thema von Arnulf · begonnen am 23. Feb 2007 · letzter Beitrag vom 26. Feb 2007
Antwort Antwort
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#1

TThread.Syncronize und critical section

  Alt 23. Feb 2007, 13:51
Ich hab mir jetzt mal das tthread objekt angeschaut und finde das eigentlich recht komfortabel.
Nur hab ich ein paar fragen zu methoden:

1. Sobald ich syncronize (fillListenFeld) aufrufe wird der zugriff des mainthreads gesperrt ( syncronisiert )
und ich kann auf den listenobjekten oder labels des mainthreads herumfurwerken.
es ist dabei nicht mehr notwendig criticalsection zu benutzen?????

2. wenn ich eine aus der syncronized procedure eine andere Funktion aufrufe wird diese
ebenfalls syncronisiert aufgerufen?????

Im prinzip möchte ich nur ein ListView und zwei lablels aktuallisieren.
keine zeitraubende sache - aber es muss hald syncronisiert werden.

3. critical section muss ich in syncronized methoden nicht aufrufen nehme ich an ???
critical section dient nur zu dirrekten mannipulation von variablen oder eben kurz mal was auslesen ??

Ich wollte theoretisch fragen wie die methoden funktionieren bzw. ob ich das richtig sehe.

lg
Arnulf
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: TThread.Syncronize und critical section

  Alt 23. Feb 2007, 14:32
Zitat von Arnulf:
1. Sobald ich syncronize (fillListenFeld) aufrufe wird der zugriff des mainthreads gesperrt ( syncronisiert )
und ich kann auf den listenobjekten oder labels des mainthreads herumfurwerken.
es ist dabei nicht mehr notwendig criticalsection zu benutzen?????
Criticalsections werden hier nicht benötigt.
Zitat von Arnulf:
2. wenn ich eine aus der syncronized procedure eine andere Funktion aufrufe wird diese
ebenfalls syncronisiert aufgerufen?????
Ja.
Zitat von Arnulf:
3. critical section muss ich in syncronized methoden nicht aufrufen nehme ich an ???
critical section dient nur zu dirrekten mannipulation von variablen oder eben kurz mal was auslesen ??
[TThread].Synchronize funktioniert so:
der Thread schickt dem Hauptthread eine Windows-Botschaft (Message).
In der Botschaft ist ein Methodenzeiger (also Adresse des Threadobjekts + Adresse der Procedure) enthalten.
Der Hauptthread arbeitet ständig seine Messagequeue ab, bis er auf diese Botschaft tritt.
Die Procedure, die Synchronize übergeben wurde wird nun im Kontext des Hauptthreads ausgeführt;
das ist der ganze Trick.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: TThread.Syncronize und critical section

  Alt 23. Feb 2007, 14:39
durch den Aufruf von Syncronize wird die Methode welche mit Syncronize aufgerufen wird im Context des Hauptthread ausgeführt (so würde sie ohne Thread laufen) und der Thread läuft erst weiter wenn der Aufruf von Syncronize zurück gekehrt ist. Wenn du also innerhalb der Syncronisierten Methode eine andere aufrufst läuft diese logicher Weise auch im Context des Hauptthreads.

CrititcalSections hingegen laufen weiterhin in dem Thread wo man sie betritt und CriticalSections sichern ab das nicht mehrere Threads gleichzeitig diese Section betreten.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#4

Re: TThread.Syncronize und critical section

  Alt 23. Feb 2007, 15:06
danke das macht alles klipp und klar
lg
Arnulf
edit:
zumindestens werde ich das so verwenden:
wenn listenfelder auffülle oder oder ähnliches also viele operationen ausführe, dann verwende ich syncronize
wenn ich nur schnell ein label ändern will auf der hauptform dann nehm ich critcal section.

critical section also bei allen dingen die keine weiteren aktionen auslösen ( wie onchange oder sowas ).
sondern einfach nur werte ändern.

und natürlich dem context des programms entsprechen

lg
Arnulf
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: TThread.Syncronize und critical section

  Alt 23. Feb 2007, 15:38
stop, wenn du vcl-dinge änderst musst du immer syncronize verwenden. Wenn du also auf eine Canvas des Hauptthreads malst musst du in diesem Threadcontext sein was nur mit syncronize geht. Wenn du eine einfache TList hast ist das egal. Aber sobald irgendwas grafiches gemacht wird immer syncronize verwenden (oder die daten in eine Variable schreiben und der Hauptthread liest diese Variable immer wieder aus und aktuallisiert (polling))
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#6

Re: TThread.Syncronize und critical section

  Alt 23. Feb 2007, 22:17
ach verstehe - und ich spiel jetzt schon eine stunde herum und verstehe einfach nicht warum
critical section bei einer tlistbox ständig hängt und mein programm nicht mehr reagiert.

hm dann muss ich mir wieder alles anders überlegen.
eigentlicht wollte ich eine auftragsliste für meinen thread haben.

der holt sich immer wenn er gerade was abgearbeitet hat aus einer list den nächsten auftrag - bzw. wartet er auf die nächste eingabe ( aus der liste ).

das ist so natürlich hinfällig
da muss ich mir jetzt etwas ganz anderes übleregen - weil bei so einer auftragsliste
jedesmal syncronize aufzurufen ist vielliecht auch nicht das ware.

hmmm... was mach ich denn jetzt ....

naja
danke auf jeden fall - dann probier ich nicht länger das zum laufen zu bekommen
vermutlich ist es das besste die auftragsliste nicht grafisch zu implementieren - und einfach ein gutes altes array zu nehmen

lg
Arnulf
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TThread.Syncronize und critical section

  Alt 24. Feb 2007, 01:02
Hi,
Willst du Threads mit Aufträgen versorgen?
Dazu hab ich hier ein Beispiel ist aber nicht von mir.
Angehängte Dateien
Dateityp: zip threadsandjobs_128.zip (2,0 KB, 25x aufgerufen)
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#8

Re: TThread.Syncronize und critical section

  Alt 25. Feb 2007, 22:43
Hab mir das beispiel kurz angeschaut.
irgendwie war mir das zu kompliziert - nein ich mach so meine ersten versuche mit der thread klasse und irgendwie funktioniert eh alles ganz gut - ohne stress.
ich hab die jobliste anders gemacht - hab da auch spezielle anforderungen.

zum beispiel verwende ich einfach syncronize dafür und mach mir damit garkeinen stress.
Beispiel:
ich hab einen indy udp client am laufen.
eine string var - in die ich immer den send string schreibe.
vom thread also:
      synchronize ( fMain.GetNextMessage ); hier die procedure.

Delphi-Quellcode:
procedure TfMain.GetNextMessage;
begin
if (fMain.gsMessage.Items.Count > 0) then
begin
     UdpThread.udpNextmsg := fMain.gsMessage.Items.Strings[0];
     fMain.gsMessage.Items.Delete(0);
end
end;
udpNextmsg ist jetzt eine variable des threads deshalb hab ich die dann im thread zur verfügung

wenn ich etwas in die liste einfügen will ( in meinem fall hab ich die an erste stelle geschoben ):
Delphi-Quellcode:
procedure AddFirstgsMessage (s : string );
begin
   fMain.gsMessage.Items.Insert(0,s);
end;
Bei mir funktioniert das sehr gut - wenn das absoluter blödsinn ist, dann mir bitte bitte mitteilen

inzwischen hab ich auch eine Frage.
der thread läuft in einer while schleife

Delphi-Quellcode:
while not (terminated) do
begin
bla bla
sleep(1);
end;
//// hier kommt jetzt der code den ich nach thread.terminate ausführen wollen würde.
der Thread wird schön beendet, aber der code nach der while schleife leider nie ausgeführt.
warum??
und welche destructor methode könnte ich verwenden?
lg
Arnulf
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: TThread.Syncronize und critical section

  Alt 26. Feb 2007, 00:58
Hi,
Das der Code nach der Schleife nicht ausgeführt wird kann eigentlich nicht sein, auser es gibt eine Exception.
Hast du das ganze mal per Einzelschritt (F7) im Debugger verfolgt?
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#10

Re: TThread.Syncronize und critical section

  Alt 26. Feb 2007, 17:40
es funktioniert jetzt
frag mich nicht warum
danke jedenfalls

lg
Arnulf
  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 07:59 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