Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Thread und VCL Zugriff (https://www.delphipraxis.net/83472-thread-und-vcl-zugriff.html)

Mavarik 3. Jan 2007 12:19


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:

chaosben 3. Jan 2007 12:33

Re: Thread und VCL Zugriff
 
Eine Lösung ist ein threadsafe gecodeter Puffer, in dem die zu visualisierenden Daten liegen.

Mavarik 3. Jan 2007 12:34

Re: Thread und VCL Zugriff
 
Zitat:

Zitat von chaosben
Eine Lösung ist ein threadsafe gecodeter Puffer, in dem die zu visualisierenden Daten liegen.

Ich dachte genau das ist das Problem, da die VCL eben nicht threadsave ist... Hast Du ein Beispiel?

Frank :drunken:

Robert Marquardt 3. Jan 2007 12:34

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.

chaosben 3. Jan 2007 12:42

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:

Zitat von Die Delphihilfe ©Borland
Mit TMultiReadExclusiveWriteSynchronizer kann der Zugriff auf den Speicher in einer Multithread-Anwendung überwacht werden. Im Gegensatz zu einem kritischen Abschnitt, der alle anderen Threads am Lesen und Schreiben in den zugeordneten Speicher hindert, ermöglicht es TMultiReadExclusiveWriteSynchronizer, dass mehrere Threads gleichzeitig aus dem geschützten Speicher lesen können. Bei einem Schreibzugriff eines Thread stellt TMultiReadExclusiveWriteSynchronizer sicher, dass der Thread exklusiven Zugriff auf den Speicher hat.

TMultiReadExclusiveWriteSynchronizer kann die Ausführungsgeschwindigkeit von Anwendungen wesentlich verbessern, in denen Threads häufig Lesezugriffe auf ein Objekt oder eine Variable ausführen, aber nur gelegentlich in das Objekt bzw. die Variable schreiben.

Jeder Zugriff auf den geschützten Speicher muss in Aufrufe der Methoden BeginRead und EndRead bzw. BeginWrite und EndWrite eingeschlossen werden. Andernfalls kann es zu Konflikten zwischen den einzelnen Threads kommen.


Mavarik 3. Jan 2007 12:43

Re: Thread und VCL Zugriff
 
Zitat:

Zitat von Robert Marquardt
Die in "keine Zeit haben" verklausulierte Aufgabe gehoert in einen weiteren Thread.

Ok wenn es dabei um eine Neuentwicklung geht, gebe ich Dir recht, aber wenn es darum geht eine bestehende "alte" Software ca. 1.2 Mio Source-Zeilen etwas zu parallelisieren, geht es nicht so einfach...

Frank :gruebel:

SirThornberry 3. Jan 2007 12:47

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.

Mavarik 3. Jan 2007 12:53

Re: Thread und VCL Zugriff
 
Zitat:

Zitat von SirThornberry
Ansonsten wäre noch die Möglichkeit das du nur alle 10 Sekunden den Status durch Syncronize mit dem Hauptthread abgleichst.

Ja darum geht es ja gerade nicht...

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

Udontknow 3. Jan 2007 13:02

Re: Thread und VCL Zugriff
 
Hallo!

Zitat:

Zitat von Mavarik
Zitat:

Zitat von SirThornberry
Ansonsten wäre noch die Möglichkeit das du nur alle 10 Sekunden den Status durch Syncronize mit dem Hauptthread abgleichst.

Ja darum geht es ja gerade nicht...

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

Eine 2. Exec? Du meinst dasselbe Programm noch einmal aufgerufen? Das ist doch ein anderer Prozess! Das die sich nicht in die Quere kommen ist doch klar.

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

Mavarik 3. Jan 2007 13:11

Re: Thread und VCL Zugriff
 
Zitat:

Zitat von Udontknow
Eine 2. Exe? Du meinst dasselbe Programm noch einmal aufgerufen? Das ist doch ein anderer Prozess! Das die sich nicht in die Quere kommen ist doch klar.

Nein natürlich nicht..

OK dann eben so... Wie erzeuge ich aus meinem Programm einen Thread/Prozess mit einer eigenen VCL-Thread?

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.
Seite 1 von 3  1 23      

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