![]() |
Thread und VCL Zugriff
Hallo Zusammen!
Thread kann man sicherlich für die unterschiedlichsten Anwendungsbeispiele einsetzen. Ich weiß nicht wie es Euch geht, aber in einer Anwendung entscheide ich mich immer dann einen Thread zu benutzen, wenn das Hauptprogramm keine "Zeit" hat oder nicht auf das Ergebniss warten soll. In 99% aller Fälle, will ich aber im Thread etwas ausgeben, einen Status, einen Log oder einen Progress-Balken. Da ein Zugriff auf die VCL jedoch "nur" über Syncronize(XY) erlaubt ist und dieser Code dann im Haupt-VCL-Thread ausgeführt wird, bringt mir der ganze Thread eigentlich nix, da ja mein Hauptprogramm gerade wie gesagt keine "Zeit" hat bzw. eben kein Application.Processmessages aufrufen kann oder soll... Wie macht Ihr das? Gibt es dafür eine Lösung? Grüsse Frank :coder: |
Re: Thread und VCL Zugriff
Eine Lösung ist ein threadsafe gecodeter Puffer, in dem die zu visualisierenden Daten liegen.
|
Re: Thread und VCL Zugriff
Zitat:
Frank :drunken: |
Re: Thread und VCL Zugriff
Das klingt nach Schwachsinn. Man macht einen Thread damit der Hauptthread weiterhin nur mit dem Betreiben der Oberflaeche via VCL beschaeftigt sein kann.
Die in "keine Zeit haben" verklausulierte Aufgabe gehoert in einen weiteren Thread. |
Re: Thread und VCL Zugriff
Das Stichwort für meinen Vorschlag lautet "TMultiReadExclusiveWriteSynchronizer".
Davon erzeugt man ein Objekt und nutzt es, um den Zugriff auf den Puffer (irgendeine Variable) zu regeln. Zitat:
|
Re: Thread und VCL Zugriff
Zitat:
Frank :gruebel: |
Re: Thread und VCL Zugriff
wenn dein Hauptthread nie zeit hat einen Status anzuzeigen dann kannst du das ganz sein lassen. Ansonsten wäre noch die Möglichkeit das du nur alle 10 Sekunden den Status durch Syncronize mit dem Hauptthread abgleichst. Oder du postest eine Message an ein Fenster des Hauptthreads. Dann ist der Status jedoch assyncron zum Thread und macht keinen großen Sinn.
|
Re: Thread und VCL Zugriff
Zitat:
Eine 2. Exec mit eigenem VCL-Thread kann ja auch parallel arbeiten... Die Frage ist, wie kann ich einen 2. VCL-Thread abspalten ohne eine 2. Exe zu erzeugen? Frank |
Re: Thread und VCL Zugriff
Hallo!
Zitat:
Ich sorge immer dafür, daß der Hauptthread "Freizeit" hat, während ein anderer Thread ackert und zwischendurch seine Fortschritte per Synchronize durchgibt (wohlgemerkt, die Arbeit fällt natürlich nicht im Synchronize an!). Cu, Udontknow |
Re: Thread und VCL Zugriff
Zitat:
OK dann eben so... Wie erzeuge ich aus meinem Programm einen Thread/Prozess mit einer eigenen VCL-Thread? Frank |
Re: Thread und VCL Zugriff
Imho gar nicht. Das, was du als VCL-Thread-Funktionalität siehst, ist ja nichts anderes als das Aufrufen der Prozedur Application.Run (siehe DPR-Code bzw. Forms-Unit). In der dort vorhandenen Schleife werden die Messages, die die Anwendung empfängt, verarbeitet. Ich wüsste nicht, wie du die Nachrichten dort unterscheiden willst, ganz davon abgesehen, daß du ein separates Application-Objekt benötigen würdest. Ob nicht im VCL-Code der einzelnen Steuerelemente auf die Application-Variable von Forms verwiesen wird, ist auch noch zu prüfen, also alles sehr schwierig.
Cu, Udontknow |
Re: Thread und VCL Zugriff
Zitat:
Trotzdem Danke ... Frank :mrgreen: |
Re: Thread und VCL Zugriff
Ja, das kommt davon, wenn man was durch die Blume sagt. :roll:
Ersetze "alles sehr schwierig" durch "sehr wahrscheinlich nicht zu realisieren". :mrgreen: Cu, Udontknow |
Re: Thread und VCL Zugriff
Zitat:
|
Re: Thread und VCL Zugriff
hehe, ok. :lol: Ist ein wenig "von hinten durchs Auge in die Brust" geschossen, aber gut. Ob man sich mit dem separaten Modul dann einen Gefallen tut, was Speicherverwaltung & co. angeht...
Cu, Udontknow |
Re: Thread und VCL Zugriff
Zitat:
Frank |
Re: Thread und VCL Zugriff
nein, in der DLL musst du natürlich auch Applicaiton.Run aufrufen. Da aber die DLL aus einem Thread aufgerufen wird läuft diese Messageque im Threadcontext. Jeder Thread hat eine eigene MessageQue
|
Re: Thread und VCL Zugriff
Zitat:
Frank |
Re: Thread und VCL Zugriff
die DLL hat nur den Vorteil das du in dem Thread VCL nutzen kannst. Die Delphi-VCL ist so ausgelegt das sie nur im initialisierenden Thread des Moduls läuft. Du kannst die VCL also innerhalb eines Moduls also nicht ohne Probleme in mehreren Threads nutzen. Wenn du ein Modul (die DLL) allerdings innerhalb eines Threads lädst wird die VCL in diesem Thread-Context initialisiert und somit kannst du zum Beispiel ein Formular innerhalb des Threads anzeigen welches den Fortschritt anzeigt.
|
Re: Thread und VCL Zugriff
Also wenn ich nicht viel Unsinn erzähle, ist es so, daß eine DLL als eigenständiges Modul sozusagen seine "eigene" Forms-Unit, Application-Variable etc. hat, und daher ist zum Beispiel ein in der DLL erstelltes Formular unabhängig von der eigentlichen Anwendung. Ist aber mehr Hörensagen als alles andere.
Cu, Udontknow |
Re: Thread und VCL Zugriff
Zitat:
Frank :mrgreen: |
Re: Thread und VCL Zugriff
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz