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
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.
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.
Delphi 2009 hat mindestens eine Eigenschaft TThread.CurrentThread. –
Wäre der aktuell ausgeführte Thread nicht der Thread, von dem Sie eine Funktion ausführen möchten?
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.
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.
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.
- 1. Wie bekomme ich das HMODULE für den aktuell ausgeführten Code?
- 2. Wie bekomme ich den aktuell ausgeführten Bereich?
- 3. Ermitteln des aktuell ausgeführten Testfalls von Nunit
- 4. Zeigt den Namen der aktuell ausgeführten Funktion an
- 5. Mbunit - Gallio. Name des aktuell ausgeführten Tests
- 6. NSIS ruft den Pfad der aktuellen Installer-Datei ab, die ausgeführt wird
- 7. Ruft den Anzeigewert von einem DropDown ab
- 8. Ruft den Text eines Schaltflächen-Widgets ab
- 9. EF ruft falsche Dezimalgenauigkeit ab
- 10. PDO ruft keine Ergebnisse ab
- 11. Wie erhalten Sie den SQL Server-Benutzernamen des aktuell ausgeführten Befehls in einem CLR-Trigger?
- 12. Ruft das übergeordnete Verzeichnis einer bestimmten Datei ab
- 13. Thread-Pool ruft Blockierungsmethoden auf
- 14. Ruft den ausgewählten Wert einer DropDownList ab. Asp.NET MVC
- 15. Ruft den aktuellen Pfad in einer Reaktionskomponente ab
- 16. Thread-Start ruft nicht run
- 17. Teamcity-Eigenschaft für den aktuell angemeldeten Benutzer
- 18. PHP SPL RecursiveDirectoryIterator RecursiveIteratorIterator ruft den vollständigen Baum ab
- 19. Ruft den Titel der Seite ab, die die Renderaktion aufruft
- 20. Ruft den Index ab, der eine IndexError-Ausnahme verursachte
- 21. Ruft den Klassennamen eines View-Controllers als Zeichenfolge ab
- 22. Ruft die Entität ab, die den aktuellen Benutzer darstellt [symfony2]
- 23. Eve: Endpunkt für den aktuell angemeldeten Benutzer
- 24. Wie zeigen Sie den Pfad des aktuell ausgeführten Python-Moduls an?
- 25. Erhalte den Namen der aktuell ausgeführten @Test Methode in @Before in JUNIT
- 26. Wie ruft man alle NSNotificationCenter-Beobachter ab?
- 27. TransactionManagerException: Transaktion ist für diesen Thread nicht aktuell
- 28. Warum ruft NSArrayController zweimal hintereinander ab?
- 29. IIS ruft Windows-Benutzer nicht ab
- 30. Facebook ruft nicht alle Bilder ab?
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
@Roddy und für zukünftige Leser: Das wurde 2009 mit einem Patch behoben und in der Version 2010 behoben. –
@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