2008-09-30 6 views
13

Ich möchte eine Funktion wie GetCurrentThread, die ein TThread-Objekt des aktuellen ausführenden Threads zurückgibt. Ich weiß, dass es einen Win32-API-Aufruf GetCurrentThread gibt, aber es gibt die Thread-ID zurück. Wenn es eine Möglichkeit gibt, TThread-Objekt von dieser ID zu bekommen, ist das auch in Ordnung.Ruft das TThread-Objekt für den aktuell ausgeführten Thread ab?

Antwort

19

Die neueste Version von Delphi, Delphi 2009, verfügt über eine CurrentThread-Klasseneigenschaft in der TThread-Klasse.

Dies wird das richtige Delphi-Thread-Objekt zurückgeben, wenn es ein nativer Thread ist. Wenn der Thread ein "Alien" -Thread ist, d. H. Er unter Verwendung eines anderen Mechanismus oder bei einem Rückruf von einem Thread eines Drittanbieters erzeugt wird, erzeugt er einen Wrapper-Thread um den Thread-Handle herum.

+0

Leider hat CurrentThread einen schwerwiegenden Fehler, der es unbrauchbar macht: http://stackoverflow.com/questions/188281/delphi-tthread- currenthread-und-eaccessviolation-ist-das-ein-Fehler-oder-mein-inkompete – Roddy

+4

@Roddy und für zukünftige Leser: Das wurde 2009 mit einem Patch behoben und in der Version 2010 behoben. –

+1

@DavidM - Danke - ja, behoben in D2010. D2009 erfordert das (inoffizielle) Patch, das mit der anderen Frage verknüpft ist - keines der offiziellen D2009-Updates behebt dieses Problem. – Roddy

0

Beantworten meiner eigenen Frage. Ich denke, es ist nicht möglich, TThread-Objekt von ID zu bekommen. Dies ist möglich, indem eine globale Variable verwendet wird. Durch Vergleichen seines Handles und der aktuellen Thread-ID kann festgestellt werden, ob es im Hauptthread läuft oder nicht.

+0

Delphi 2009 hat mindestens eine Eigenschaft TThread.CurrentThread. –

0

Wäre der aktuell ausgeführte Thread nicht der Thread, von dem Sie eine Funktion ausführen möchten?

0

Sie können den Zeiger der Instanz TThread speichern im Kontext des aktuellen Thread über den Aufruf TlsSetValue API und es dann TlsGetValue mit abgerufen werden. Beachten Sie jedoch, dass dies nur funktioniert, wenn Sie versuchen, die TThread-Instanz des aktuellen Threads abzurufen/zu speichern.

19

Von Ihrer eigenen Antwort, so scheint es vielleicht nur Sie wollen einfach nur

if Windows.GetCurrentThreadId() = System.MainThreadID then 
// ... 

verwenden können, wobei in diesem Fall auf „wenn läuft im Hauptthread oder nicht bestimmen“ Auch wenn dies nicht der Fall arbeiten DLL, die mit Delphi erstellt wurde, wenn sie von einem Arbeitsthread geladen wurde.

4

Ich verwende meinen eigenen TThread-Nachfolger, der sich in einer globalen Liste registriert und mit einer Sperre geschützt wird.

Auf diese Weise kann eine Methode in diesem Abkömmling die Liste durchlaufen und einen TThread erhalten eine ID geben.