Autor Beitrag
g1o2k4
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Mi 16.07.08 10:16 
hi


ich übergebe einen bool pointer an einen thread...wenn der thread fertig mit der arbeit ist soll er den pointer inhalt auf false setzen...
während der thread arbeitet läuft im prozess eine schleife die die ganze zeit prüft ob der thread fertig ist...also inhalt der boolvariable ist false (ja/nein).
wenn es false ist soll der thread zerstört und ein neuer geöffnet werden. aber soweit kommt der prozess nicht. d.h. anscheinend kann der thread nicht auf den bool wert zugreifen.

jemand ne idee warum ?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.07.08 10:51 
Moin!

user profile icong1o2k4 hat folgendes geschrieben:
ich übergebe einen bool pointer an einen thread...wenn der thread fertig mit der arbeit ist soll er den pointer inhalt auf false setzen...
während der thread arbeitet läuft im prozess eine schleife die die ganze zeit prüft ob der thread fertig ist...
Komisches Sync-Konzept... :|

Hast du dich schonmal mit dem Ereignis OnTerminate der TThread-Klasse beschäftigt? Oder verwendest du die WinAPI für Threads direkt?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mi 16.07.08 11:08 
Wenn du Pointer benutzt musst du 100%tig sicher gehen, dass die Variable auf die du dich beziehst auch wirklich immer gültig ist! Ansonsten hast du superschnell einen Pointer auf einen ungültigen Speicherbereich. Sonst wüsste ich nicht warum ein Thread nicht auf einen Wert zugreifen können sollte. Denn jede Variable hat eine eigene Adresse. Und das ist alles was dafür nötig ist.

Das ständige Pollen halte ich aber auch eher für nicht so optimal. Da wäre es besser, wenn der Thread bescheid geben würde, dass er fertig ist. Also zum Beispiel das OnTerminate Event wie Narsens ja schon sagte.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Mi 16.07.08 11:49 
ich hab mich noch nicht viel mit threads beschäftigt...ich versteh auch nicht ganz den unterschied zwischen thread.free -.destroy -.terminate...


die bool variable ist immer gültig von application.create bis application.close.

ich habe ja geschrieben,dass ich immer neue threads für jede aufgabe erstelle. das will ich ja auch gar nicht. das beste wäre, ich starte bei application.create vier threads (oder wieviele ich will) und gebe ihm bei einem buttonklick bestimmte werte und lasse ihn dann laufen. ich weiß aber nicht wie ich den thread starte. ich dachte bisher er startet automatisch bei execute. und mir fehlt auch noch die kenntnis darüber, wie ich ihn melden lasse, dass er fertig ist.


ich kann ja mal das beispiel von meinem projekt angeben:
programm startet:
-ich lade die pfade von dateien in eine liste (*.mp3)
-jetzt will ich 4 threads gleichzeitig die mp3 tags der dateien auslesen lassen
-d.h. ich starte vier threads und übergebe jeder den ersten pfad der liste, lösche diesen, so dass der nächste thread den nächsten pfad bekommt.


wenn die threads fertig sind melden sie halt nicht, dass sie fertig sind (das bekannte bool ptr problem), was zur folge hat, dass der prozess in ner endlosschleife hängt, da die abbruchbedingung der schleife ist dass die liste leer ist.
aber wenn ich keine neuen threads starten kann, weil sie angeblich immer noch arbeiten, kann ich auch keine neuen pfade übergeben.

mein programm muss also erkennen: thread hat angehalten -> gebe angehaltenem thread neuen pfad -> starte diesen thread wieder
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.07.08 11:55 
Moin!

user profile icong1o2k4 hat folgendes geschrieben:
ich hab mich noch nicht viel mit threads beschäftigt...
Hier ist ein VCL-TThread-Beispiel aus unserer FAQ. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Mi 16.07.08 12:22 
also hab ich das richtig verstanden ?
ich hatte jetzt folgendes vor:
ich create einen thread mit diesem notify-on-end procedur, die aufgerufen wird beim ende.
in dieser procedur setze ich mit einer öffentlichen set-funktion des threads den neuen dateipfad und führe dann wieder thread.execute aus ?

execute startet also den thread.
und um ihn gestoppt zu starten gebe ich in der create funktion
ausblenden Delphi-Quelltext
1:
inherited Create(true)					

?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.07.08 12:49 
Moin!

user profile icong1o2k4 hat folgendes geschrieben:
also hab ich das richtig verstanden ?
ich hatte jetzt folgendes vor:
ich create einen thread mit diesem notify-on-end procedur, die aufgerufen wird beim ende.
Ich fürchte, das hast du noch nicht richtig verstanden... :?

Du musst dich zunächst mal entscheiden, ob du
  • einen Thread dauerhaft verwenden willst und bei Bedarf arbeiten lassen, oder
  • einzelne Threads für eine Aufgabe erzeugst und beim Beenden freigibst
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mi 16.07.08 14:25 
Also Free und Destroy sollten dir eigentlich klar sein. Destroy ist der Destruktor und Free ruft intern den Destructor auf und führt sicherheitsabfragen durch.

Terminate setzt innerhalb der Threadinstanz eine Variable. Die mit Terminated innerhalb des Threads überprüft werden kann. Zum sauberen Beenden des Threads.

Der Thread wird mit Resume gestartet. Bzw Automatisch, wenn der Konstruktor mit False erzeugt wurde. Der Thread wird immer wom Betriebssystem aufgerufen und dabei wird die Execute Methode aufgerufen. Wenn du Execute selber aufrufst wirst du niemals einen richtigen Thread haben. Also immer Resume oder via Konstruktor automatisch starten lassen.

Thread Tutorial.


Zu deinem Programm: Ob du da mehr als einen Thread benötigst wage ich mal zu bezweifeln. Denn du greifst auf deine Festplatte zu. Wenn du nur einen Thread hast, dann kann die Festplatte eine Datei am Stück einlessen und gut. Bei 4 Threads muss die Festplatte immer zwischen 4 Dateien hin und her springen. Das Springen kostet Zeit und deine Threads müssen dann auf die Platte warten. Im Endeffekt wird es dadurch sogar noch langsamer als nur mir einem, da bei Einem das Springen wegfällt. Mehrere Threads lohnen sich erst bei Berechnungen auf der CPU oder beim der Komminikation mit verschiedenen IPs erst richtig. Jedes mal wenn 2 Threads auf die selben Sache zugreifen ist die Wahrscheinlichkeit groß, dass einer Warten muss.

Ich persönlich würde aber eher einen Manager vorschalten. Also deine GUI übergibt X Dateien an einen Manager und dieser verwaltet die Threads. Die Threads würden dann auch nur eine einzige Aufgabe bewältigen und sich dann wieder beenden. Es wäre auch möglich, dass die Threads dauerhaft laufen. Aber dann musst du zu viel synchronisieren und aufpassen, dass bloß nichts schief geht. Da ist es einfacher, wenn die Threads so einfach wie möglich sind. Ist ein Thread fertig (OnTerminate), dann startet der Manager einen neuen. So lange bis deine Dateiliste komplett abgearbeitet ist.

Du könntest die Dateien auch in JobObjekte verpacken. Also eine Job Klasse heißt dann TJobReadTags oder so. Die sind von einer Basisi und ein Thread führt dann nur noch einen Job aus. Die Klasse weiß, dass sie Tags lesen soll also tut sie es. Ist der Thread fertig wird der Job inklusive Ergebniss wieder an die GUI übergeben und fertig. Dann könntest du die unterschiedlichsten Jobs in Threads verpacken. Und du könntest auch verhindern, dass 2 Jobs des Typen XYZ gleichzeitig gestartet werden wärend der Typ HKL bis zu 4 mal gestartet werden kann. Die Maximalanzahl der Threads würde auch der Manager regeln.

Ich hoffe das war jetzt nicht zu verwirrend. Wenn doch. Bitte nachhacken.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Mi 16.07.08 20:19 
also ich bin jetzt etwas weiter...

www.delphi-forum.de/....php?p=513659#513659