AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Objekte vom Thread auf Form darstellen.
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte vom Thread auf Form darstellen.

Ein Thema von stiftII · begonnen am 11. Okt 2009 · letzter Beitrag vom 11. Okt 2009
Antwort Antwort
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#1

Objekte vom Thread auf Form darstellen.

  Alt 11. Okt 2009, 01:23
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:
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;
und meine Thread-prozedur soll dann in etwa so aussehen:

Delphi-Quellcode:
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;
~ stift
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Objekte vom Thread auf Form darstellen.

  Alt 11. Okt 2009, 03:00
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;
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Objekte vom Thread auf Form darstellen.

  Alt 11. Okt 2009, 09:15
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:
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;
Sicherheitshalber würde ich noch den Zugriff auf 'fSleepRequest' über eine Critical Section kapseln.

Ich würde mir mal Synchronisationsobjekte anschauen (Semaphoren, Mutexe, Events). Die sind besser geeignet, die Ausführung eines Threads zu kontrollieren.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Objekte vom Thread auf Form darstellen.

  Alt 11. Okt 2009, 09:16
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#5

Re: Objekte vom Thread auf Form darstellen.

  Alt 11. Okt 2009, 11:58
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Objekte vom Thread auf Form darstellen.

  Alt 11. Okt 2009, 16:47
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#7

Re: Objekte vom Thread auf Form darstellen.

  Alt 11. Okt 2009, 17:21
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Objekte vom Thread auf Form darstellen.

  Alt 11. Okt 2009, 18:10
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:
  • längere Dateiarbeit
  • Datenbankoperationen
  • längere (meist numerische) Berechnungen
  • ...
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.
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