Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
24. Aug 2011
Ich weis grad nicht, wie speziell ich darauf antworten soll.
Für Threads gibt es keine 0815 Lösung. Es gibt ein paar Möglichkeiten, wie man so etwas gestalten kann (z.B. WorkerThread oder ThreadPool, ...) aber du musst es immer speziell an deine Aufgabe anpassen.
Die Verwendung einer Critical Section geht am besten über eine Klasse:
//Beispiel aus der aktuellen Version (2.03) von...
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
23. Aug 2011
Eben nicht.
Dieses Problem tritt auf, wenn TmyThread Suspend aufruft und der MainThread gleichzeitig Resume aufruft, was bei deinem Code durchaus passieren kann.
Dann must du um jeden Zugriff (eigentlich nur, wenn mindestens ein Thread auch schreibend darauf zugreift) EnterCriticalSection und LeaveCriticalSection basteln (und zwar von der exakt gleichen Objektinstanz)
Allerdings hast du...
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
23. Aug 2011
Dazu eine Frage:
Welche Variablen in Execute verwendest du auch außerhalb des Threads (und zwar in dem Moment, wo der Thread läuft)?
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
23. Aug 2011
1. Such dir halt einen Namen aus (suspend ist ja leider schon vergeben; genauso: break und interrupt) Stop wäre noch übrig. Aber dann neigt man beim weitermachen dazu start zu verwenden, was ja schon vergeben ist. Das Antonym für continue ist ja discontinue. Gibts aber zumindest in meinem aktiven Wortschatz bisher nicht. Naja, lass dir was einfallen....
2. CriticalSection ist ein...
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
23. Aug 2011
Und so ein Teilaspekt ist halt auch folgender:
(Suche nach "SuspendThread race condition")
Forum: Object-Pascal / Delphi-Language
Delphi
by sirius,
23. Aug 2011
"Halted" ist eine Funktion, die nur testet ob der Thread angehalten wurde (ich habe mich an die Namen von Tryer gehalten).
In der Methode Terminate muss dies ja überprüft werden, ansonsten führt folgendes zum Deadlock, wenn der Thread im Haltezustand ist:
myThread.Terminate;
myThread.WaitFor; <--- Programm tot
myThread.Free;
Diese Sache benötigts du bei allen Methoden, wo ein Thread...