![]() |
Objekte vom Thread auf Form darstellen.
Hallo :).
Ich probiere gerade nen wenig die threads(TThread-Klasse) aus. Ich möchte nun, dass mein Thread auf eine checkbox reagiert, und nur solange läuft, wie die checkbox.checked ist, dafür habe ich in meiner Threadklasse eine checkbox deklariert. Wie kann ich diese aber auf Form1 darstellen und benutzen ? Ich glaub ich habe da irgendwo nen Denkfehler. Hier ist mein Code(der relevante Teil).
Delphi-Quellcode:
und meine Thread-prozedur soll dann in etwa so aussehen:
type
TMyOwnThread = class(TThread) CheckBox2: TCheckBox; protected procedure Execute; override; end; TForm1 = class(TForm) ListBox1: TListBox; procedure FormCreate(Sender: TObject); private { Private declarations } public end;
Delphi-Quellcode:
~ stift
procedure TMyOwnThread.Execute;
begin repeat WriteLn('Thread Working'); try sleep(1000); inc(testcount); except on e: exception do begin extext := 'Thread Malfunctioned'; end; end; until not checkbox2.checked; end; |
Re: Objekte vom Thread auf Form darstellen.
Du kannst es auch auf dem Form darstellen. Du willst doch das sich der Thread aktiviert wenn CheckBox.Checked true ist oder?
Dafür kannst du es auch ganz normal aufs Form setzen. Und bei OnClick machst du folgendes:
Delphi-Quellcode:
//unter der Form-Variable
var MyThread : TMyOwnThread; procedure TForm2.CheckBox1Click(Sender: TObject); begin If CheckBox1.Checked then begin If not Assigned(MyThread) then //nur um festzustellen ob der Thred nicht schon erzeugt wurde MyThread := TMyOwnThread.Create(True) //erstellt den Thread und startet ihn else MyThread.Resume; //startet ihn wieder wenn Suspend davor aufgerufen wurde end else MyThread.Suspend; //stoppt den Thread end; |
Re: Objekte vom Thread auf Form darstellen.
Es ist eine ganz schlechte Idee, einen Thread per Suspend/Resume zu kontrollieren. Du hast nämlich keinerlei Kontrolle, was der Thread gerade macht.
Viel besser ist es, von außen den Wunsch äußern zu dürfen, das der Thread sich schlafen legt. Der Thread selbst prüft dann an für ihn sicheren Stellen, ob er sich jetzt schlafen legen soll, oder nicht. Beispiel:
Delphi-Quellcode:
Sicherheitshalber würde ich noch den Zugriff auf 'fSleepRequest' über eine Critical Section kapseln.
Type
TMyThread = Class (TThread) Private fSleepRequest : Boolean; Protected Procedure Execute; Override; Public Procedure GotoSleep(); Procedure WakeUp(); End; ... Procedure TMyThread.WakeUp(); Begin fSleepRequest := False; If Suspended Then Resume; End; Procedure TMyThread.GotoSleep(); Begin fSleepRequest := True; End; ... Procedure TMyThread.Execute; Begin ... While not Terminated Do Begin If fSleepRequest Then Begin fSleepRequest := False; Suspend; End; // <Code, der vollständig ausgeführt werden muss> End; ... End; .... Procedure TForm1.CheckBox1Click (Sender : TObject); Begin If CheckBox1.Checked Then // Goto sleep MyThread.GotoSleep() else MyThread.WakeUp(); End; Ich würde mir mal Synchronisationsobjekte anschauen (Semaphoren, Mutexe, Events). Die sind besser geeignet, die Ausführung eines Threads zu kontrollieren. |
Re: Objekte vom Thread auf Form darstellen.
:warn: nach msdn ist das suspenden von Threads nur durch einen Debugger zulässig.
[roter Kasten] hat ja schon jemand geschrieben Edit: Aber auch innerhalb des Threads würde ich kein suspend verwenden sondern Events. |
Re: Objekte vom Thread auf Form darstellen.
Hallo,
Danke für die Antworten. Gibt es denn keine Möglichkeit, dass der Thread selbst überprüft, ob die checkbox.checked ist(Wie in meinem Beispiel) ? Natürlich erreiche ich mit dem Vorschlag von alzaimar dasselbe, mich würde nur interessieren, wie ich von der Threadklasse aus, auf meine "Formklasse" zugreifen kann. //Keine elegante Lösung, aber es klappt jetzt =)... Ich greife nun einfach vom thread heraus direkt auf "form1.irgendwas" zu, und hoffe, dass die critical sections exceptions vermeiden, wenn der Thread und meine Form gleichzeitig auf dasselbe Objekt zugreifen. ~stift |
Re: Objekte vom Thread auf Form darstellen.
ganz schlecht. Software, die auf Hoffnung und Glaube baut sollte man nicht schreiben. Wir sind Informatiker und keine Theologen.
Über dich lieber an Threads, die brauchst do sowieso in jedem Projekt. |
Re: Objekte vom Thread auf Form darstellen.
Da hast du natürlich Recht.
Die bessere Lösung wäre es, die Einstellungen die der Thread vornimmt erstmal in temporären Variablen zu speichern, und diese dann mit einem Timer oder ähnlichem auf die Form zu aktualisieren, somit würde man Zugriffsverletzungen vermeiden. (Ich hoffe das macht Sinn ;) ). Allerdings verhindern die "critical sections" offenbar zugriffsverletzungen. Und Somit brauche ich diesen Umweg nicht gehen. Ich gestehe, ich weiß nicht wirklich, wie diese Funktionieren, aber sie schützen den Speicher, sodass immer nur mein Thread auf die Form.irgendwas zugreift. Oder wie würdest du das lösen ? (Ein Thread, der "Form1" verändert, während Form1 auch auf die Objekte von Form1 zugreift). ~stift |
Re: Objekte vom Thread auf Form darstellen.
mittels der Methode synchronize.
Dein Problem hier, ist, dass es kein sinnvolles einfache Threadbeispiel gibt. Prinzipiell gilt, dass alle visuellen Sachen im Mainthread gemacht werden. Alles andere kannst du in einen Thread auslagern. Beispiele:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 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