Was ist der richtige Weg um einen suspendierten Thread in Delphi 2007 zu starten?

8

In Delphi XE kann ich die Startprozedur verwenden, aber diese Methode existiert in Delphi 2007 nicht.

Dieser Beispielcode funktioniert in delphi xe mit Start

%Vor%

aber in Delphi 2007 existiert die Prozedur start nicht, daher verwende ich die resume-Prozedur, die in den neuen Versionen von delphi veraltet ist.

%Vor%

Also die Ruhe ist, es ist ok,%%%%% in Delphi 2007 zu verwenden oder ich muss einen anderen Weg verwenden, um einen unterbrochenen Thread zu starten?

Vielen Dank im Voraus.

    
Salvador 17.11.2010, 16:02
quelle

5 Antworten

19

Der richtige Weg, um einen gesperrten Thread zu starten, ist, niemals einen suspendierten Thread an erster Stelle zu haben.

Es gibt eine bessere Möglichkeit, Threads zu erstellen. Wenn der Aufrufer muss einen Wert für das Objekt bereitstellen muss, damit die Klasse ordnungsgemäß funktioniert, machen Sie es nicht optional: Erfordern Sie es als Parameter für den Konstruktor. Und wenn es nur einen gültigen Wert für diesen Parameter gibt, dann machen Sie ihn nicht einmal zu einem Parameter: Schreiben Sie ihn einfach im Konstruktor fest. (Wie oft haben Sie eine Thread-Klasse geschrieben, die sich bei der Beendigung nur manchmal freigibt? Ich habe das nie gesehen.)

%Vor%

Dann kannst du die Ron Popeil-Methode zum Erstellen von Threads verwenden: Setze es einfach und vergiss es!

%Vor%

Der Aufrufer muss nach dem Erstellen des Threads nichts mit dem Thread tun. Und da es sich um einen Terminierungs-Thread handelt, der frei ist, ist es möglich, dass der Aufrufer überhaupt keinen Verweis auf die Variable MyThread behält, da die Referenz ungültig wird, sobald der Thread ausgeführt wird.

(Worum geht es in der inherited Create(False) -Zeile, die einen Thread erstellt, der vor Ausführung des Rests des Konstruktors ausgeführt wird? Sei nicht! Das wurde vor über einem Jahrzehnt in Delphi 6 behoben. Der Thread wird automatisch gestartet selbst nach dem Konstruktor beendet, siehe TThread.AfterConstruction , um zu sehen, wie.)

    
Rob Kennedy 17.11.2010, 16:58
quelle
5

Es ist nichts falsch daran, Resume für einen Thread aufzurufen, der mit dem CreateSuspended-Parameter im Konstruktor auf true erstellt wurde. (Warum sonst würde es einen CreateSuspended-Parameter geben?)

Das eigentliche Problem tritt jedoch auf, wenn Sie einen laufenden Thread anhalten / fortsetzen. Dies ist hauptsächlich auf Verweise auf offene Ressourcen wie COM-Objekte zurückzuführen. (Wenn zum Beispiel ein ADO-Verbindungsobjekt aktiv ist und eine Abfrage ausgeführt wird ... ist es nicht sehr ideal, diesen Thread zu suspendieren und später wieder aufzunehmen ... es wird offensichtlich nicht immer gut für dich funktionieren oder die Datenbankverbindung in diesem Szenario.)

Wenn Sie mit Ihren externen Referenzen vorsichtig sind, wird das Unterbrechen / Fortsetzen eines laufenden Threads viel sicherer, außer den möglichen Race-Bedingungen, die auftreten können ... aber das sind Antworten auf viele andere Fragen ...

>     
Darian Miller 18.11.2010 03:26
quelle
1

Ja, das ist der richtige Weg für ältere Delphi-Versionen, die keine Prozedur Start haben.

    
Jens Mühlenhoff 17.11.2010 16:18
quelle
1

Resume und Suspend sind in Delphi 2010 und neueren Versionen veraltet. Scheint im Grunde zu vermeiden, sie für die Thread-Synchronisation zu verwenden. Sie sind dafür nicht gedacht.

Jedenfalls, wenn Sie nur einen Thread wiederherstellen möchten, der suspendiert wurde, dann ist der Aufruf von Resume in älteren Versionen sicher.

Wenn Sie sowohl in Delphi als auch in Delphi den gleichen Quellcode verwenden müssen, können Sie das bedingte Kompilieren verwenden, um eine Warnung in XE zu vermeiden.

Sehen Sie sich auch diese Frage an, die zu Ihrer Frage gehört:

TThread.resume ist in Delphi-2010 veraltet, was sollte an Ort und Stelle verwendet werden?

    
vcldeveloper 17.11.2010 16:19
quelle
0

Sie sollten Suspend niemals auf einem tthread aufrufen, da dies nicht sicher ist, und resume sollte nur dazu verwendet werden, einen Thread zu starten, der suspendiert wurde.

In Delphi 2010 wurde der Suspend-and-Resume-Modus, wo er abgeschrieben wurde, und der Methodenstart eingeführt, um dies zu verstärken.

Eine ausführlichere Erklärung finden Sie in diesem Thread in den Codegears-Foren.

    
MikeT 17.11.2010 21:59
quelle