Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei der Ausführung eines Threads (https://www.delphipraxis.net/137713-problem-bei-der-ausfuehrung-eines-threads.html)

Tommahawk 27. Jul 2009 08:54


Problem bei der Ausführung eines Threads
 
Guten Morgen liebe Delphi-Freunde! :freak:

Bevor ich ins Detail gehen werde, möchte ich an Euch erst einmal eine allgemeine Frage zum Thema Threads richten.

Ausgangslage:

Ich habe eine VCL-Anwendung mit einem Button erstellt.
In der OnClick-Ereignisroutine des Buttons wird ein Thread erzeugt, der sofort startet.

Frage:

Welche Auswirkungen hat es auf die Ausführung des Threads, wenn nach dessen Erzeugung in der OnClick-Ereignisroutine des Buttons weitere, beliebige Anweisungen verarbeitet werden? :gruebel:


Viele sonnige Grüße vom Bodensee :hi:

Thomas a.k.a. Tommahawk

Klaus01 27. Jul 2009 08:59

Re: Problem bei der Ausführung eines Threads
 
Zitat:

Zitat von Tommahawk
Guten Morgen liebe Delphi-Freunde!
Welche Auswirkungen hat es auf die Ausführung des Threads, wenn nach dessen Erzeugung in der OnClick-Ereignisroutine des Buttons weitere, beliebige Anweisungen verarbeitet werden?

Keine,
aber gehe mal ins Detail - irgendein Problem wirst Du ja damit haben, oder?

Grüße
Klaus

Tommahawk 27. Jul 2009 09:37

Re: Problem bei der Ausführung eines Threads
 
Hallo Klaus,

leider liegt mein Beispiel-Quelltext zu Hause. Ich werde ihn aber heute Abend posten.

Im Moment kann ich Dir nur eine ausführliche Beschreibung meines Problems anbieten.

Beschreibung:

Außer dem Button existiert noch ein kleines Panel auf dem Formular. Alle x Millisekunden soll die Farbe des Panels geändert werden, sodass ein Blinkeffekt entsteht. Diese Aufgabe übernimmt mein Thread. Währenddessen verrichtet der "Mainthread" in der OnClick-Ereignisroutine seine eigentlichen Arbeiten (z.B. Berechnungen, Verarbeitung von Daten, ...). Nachdem der "Mainthread" seine Arbeiten abgeschlossen hat, terminiert mein eigener Thread. Zusammengefasst: Das Panel blinkt relativ gleichmäßig, während meine Anwendung seine eigentliche Arbeit verrichtet ... zum Beispiel, wenn ich auf den Button klicke. Das ist die Theorie.

In der Praxis sieht das Ganze so aus, dass mein Thread erzeugt wird, aber wohl erst zur Ausführung kommt, wenn die restlichen Anweisungen in der OnClick-Ereignisroutine des Buttons abgearbeitet worden sind. Das sieht dann nicht mal ansatzweise danach aus, dass meine Anwendung Anweisungen ("pseudo")-parallel ausführt.

Meine Vermutung:

Es hat irgendetwas mit der Verarbeitung von Windows-Messages zu tun.


Viele Grüße

Thomas

Bernhard Geyer 27. Jul 2009 09:40

Re: Problem bei der Ausführung eines Threads
 
Zitat:

Zitat von Tommahawk
Alle x Millisekunden soll die Farbe des Panels geändert werden, sodass ein Blinkeffekt entsteht. Diese Aufgabe übernimmt mein Thread.

Schon mal durchgelesen was Delphi so in der Unit schreibst wenn du eine Thread-Klasse über "Menu/Neu.." erstellst :gruebel:

Tommahawk 27. Jul 2009 09:52

Re: Problem bei der Ausführung eines Threads
 
Hallo Bernhard!

Ganz klare Antwort: NEIN :nerd:

Ich habe meine Thread-Klassen bisher immer manuell erstellt.

Meinst Du den folgenden Kommentar?

Delphi-Quellcode:
{ Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen
  nur in einer Methode namens Synchronize aufgerufen werden, z.B.

      Synchronize(UpdateCaption);

  und UpdateCaption könnte folgendermaßen aussehen:

    procedure TMyThread.UpdateCaption;
    begin
      Form1.Caption := 'Aktualisiert in einem Thread';
    end; }
Also ich bin der Meinung, dass ich das in meiner eigenen Thread-Klasse so umgesetzt habe, sofern Du mich auf die Prozedur "Synchronize" aufmerksam machen wolltest.


Viele Grüße

Thomas

Bernhard Geyer 27. Jul 2009 09:57

Re: Problem bei der Ausführung eines Threads
 
Zitat:

Zitat von Tommahawk
Also ich bin der Meinung, dass ich das in meiner eigenen Thread-Klasse so umgesetzt habe, sofern Du mich auf die Prozedur "Synchronize" aufmerksam machen wolltest.

Wollte ich.


Aber zeig doch mal ein bischen Code was du bisher hast.

Tommahawk 27. Jul 2009 10:01

Re: Problem bei der Ausführung eines Threads
 
Siehe oben! Heute Abend. :wink:

Luckie 27. Jul 2009 10:13

Re: Problem bei der Ausführung eines Threads
 
Zitat:

Alle x Millisekunden soll die Farbe des Panels geändert werden, sodass ein Blinkeffekt entsteht. Diese Aufgabe übernimmt mein Thread.
Dir ist klar, dass der Code des Threads, der die Farbe ändert, im Kontext des Hauptthreads ausgeführt wird? Und da das alle paar Millisekunden passiert kannst du auch auf den Thread verzichten.

JamesTKirk 27. Jul 2009 10:33

Re: Problem bei der Ausführung eines Threads
 
Wäre es sowieso nicht sinniger den neuen Thread die Berechnungen ausführen zu lassen, während sich der Mainthread um die GUI kümmert? Dann kann man sich dieses ganze ge-synchronize-e sparen :?

Gruß,
Sven

Tommahawk 27. Jul 2009 10:53

Re: Problem bei der Ausführung eines Threads
 
*hmm*

Dann definiere ich hiermit den Wertebereich des Intervals genauer. Minimum sind 2 Sekunden (2000 Millisekunden).

@Luckie: Bleibst Du bei Deiner Aussage?

@JamesTKirk:

Im Grunde genommen, ist das hier ein vereinfachtes Beispiel. Mir war nicht ganz klar, dass ich so weit ausholen muss.

Im ganz Speziellen geht es darum, über eine TCP/IP-Verbindung von einem TCP/IP-Server eine Datei abzuholen, lokal abzuspeichern und zu verarbeiten und dem TCP/IP-Server mitzuteilen, ob die lokale Verarbeitung der Datei erfolgreich ausgeführt worden ist, oder eben nicht. Während der lokalen Verarbeitung der Datei muss die Verbindung zum TCP/IP-Server durch einen regelmäßigen "Ping" aufrechterhalten werden, da sonst der TCP/IP-Server die Verbindung nach 10 Sekunden abbricht. Auf den eigentlichen Quelltext der Anwendung und somit auf den Quelltext der lokalen Verarbeitung der Datei, sowie auf den TCP/IP-Server habe ich keinen Einfluss. Ich stelle lediglich eine Klasse zur Verfügung, in der intern die gesamte TCP/IP-Kommunikation implementiert ist. Nur der "Ping", den ich in einen Thread ausgelagert habe, scheint genauso wenig zu funktionieren, wie das Ändern der Farbe des Panels in meinem vereinfachten Beispiel.


Viele Grüße

Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz