Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Komponente innerhalb eines Threads erstellen (https://www.delphipraxis.net/74055-komponente-innerhalb-eines-threads-erstellen.html)

th_bone 27. Jul 2006 13:22


Komponente innerhalb eines Threads erstellen
 
Hi,

ich möchte gerne wissen wie ich eine Komponente in einem thread createn und
auf deren ereignisse reagieren kann

Hier der korrigiere und funktionsfähige Code

Delphi-Quellcode:
  Tmytimer = class(TThread)
    private
      myTimer: TTimer;
    public
     constructor Create;
     procedure execute; override;
     procedure timerevent(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TmyTimer.Create;
begin
  inherited Create(False);
  FreeOnTerminate:=True;
  myTimer:=TTimer.Create(nil);
  myTimer.Interval:=1000;
  myTimer.OnTimer:=timerEvent;
  myTimer.Enabled:=True;
end;

procedure Tmytimer.timerevent(Sender: TObject);
begin
  beep;
end;

procedure Tmytimer.execute;
begin
while not Terminated do
  sleep(10);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 tmytimer.Create;
end;

Angel4585 27. Jul 2006 13:30

Re: Komponente innerhalb eines Threads erstellen
 
Es heisst nicht (System : TObject) sonder (Sender : TObject) das sollte eigentlich so gehen.. aber macht es sin einen timer im Thread zu erstellen :gruebel:

himitsu 27. Jul 2006 13:36

Re: Komponente innerhalb eines Threads erstellen
 
wenn du nicht von außerhalb auf den "Timer" (das erstellte Objekt zugreifst, dann kannst du auch ganz ruhig TObject verwenden, denn von dem Thread aus ist dieses objekt ja "threadsicher".

th_bone 27. Jul 2006 13:43

Re: Komponente innerhalb eines Threads erstellen
 
@Angel4585

Sorry natürlich (Sender: TObject)... das geht aber auch nicht...

Der Timer ist für mich nur eine einfache komponente um zu verstehen wie ich eine
komponente innerhalb eines threads mit dazugehörigen ereignissen createn kann.

Mir geht es also um die grundsätzliche vorgehensweise und nicht um den timer selbst.

Sinn macht es sicherlich, da der timer so unabhängig vom Hauptthread laufen würde...

@himtsu

also irgendwie stehe ich auf der Leitung ich krieg es nicht hin den Timer wie auch immer zu createn.. ist mein ansatz so überhaupt richtig ?

Danke

Ralf

Der_Unwissende 27. Jul 2006 13:46

Re: Komponente innerhalb eines Threads erstellen
 
Hi,
versteh mich nicht falsch, aber wenn ich mir Frage und Code so anschaue, denke ich da fehlen noch ein paar Grundlagen. Nichts gegen deinen Code und erst recht nichts gegen die Frage, aber du sprichst hier Threading. Ein Thema, dass nicht ganz so ohne ist. Man kann natürlich einfach Threads erstellen und mit ihnen Arbeiten, aber man kann noch viel einfacher Fehler machen. Die dann zu finden ist ein Thema für sich (an dem nichts mehr einfach ist!).
Ich schätze hier einfach nur mal, dass du dich noch nicht all zu weit mit Thread und Synchronisation beschäftigt hast oder? Ich würde dir dazu raten es zu tun. Ist dein Programm erstmal komplexer und steckt ordentlich Arbeit drin, dann wirst du es nicht mögen wenn alle x male oder auf anderen Rechnern dein Programm plötzlich nicht mehr läuft. Das ist nämlich eines der Probleme die ohne die hinter Threads stehende Theorie schnell auftritt: Du schaffst Programme die nicht-determinieren. Es ist dann nahezu zufällig, welche Ergebnisse du bekommst. Insbesondere kann es 100 mal gut gehen und dann nie wieder.

Wie gesagt, wirkt einfach nur so als ob dir da was fehlt. Ich glaube du findest einige Tuts mit der Suche (denke Luckie hatte unter anderem eins).

Gruß Der Unwissende

PS: Hast du die richtige Unit für den Timer eingebunden? Und was genau ist denn die Fehlermeldung die du bekommst?

Angel4585 27. Jul 2006 13:51

Re: Komponente innerhalb eines Threads erstellen
 
was mich an dem ganzen gerade am meisten irritiert ist, das der Thread sich ja glich weider beendet oder täusch ich mich da?


Delphi-Quellcode:

  TTestThread = class(TThread)
    private
      FTimer : TTimer;
    public
      constructor Create;
      procedure Execute; override;
      procedure TestTimer(Sender : TObject);
    end;

.
.
.


{ TTestThread }

constructor TTestThread.Create;
begin              
inherited Create(False);
FreeOnTerminate:=True;
FTimer:=TTimer.Create(nil);
FTimer.Interval:=1000;
FTimer.OnTimer:=TestTimer;
FTimer.Enabled:=True;
end;

procedure TTestThread.Execute;
begin
while not Terminated do
  sleep(10);
end;

procedure TTestThread.TestTimer(Sender: TObject);
const f = 'C:\Testsl.txt';
begin
with TstringList.Create do
  try
    if Fileexists(f)then
      LoadFromFile(f);
    Add(DateTimeToStr(Now));
    SaveToFile(f);
  finally
    Free;
    end;
end;
Also das fuppt bei mir.. Er schreibt mir jede Menge in die Datei

th_bone 27. Jul 2006 16:14

Re: Komponente innerhalb eines Threads erstellen
 
@Angel4585

Danke mit Deinem Codeschnipsel hab ichs jetzt kapiert - ich habe meinen korrigierten Code bei meine ersten thread eingefügt falls jemand ein komplettes Bsp. sucht

@Der_Unwissende

Sicher bin ich noch ein newbie bei threads aber deshalb stelle ich ja hier meine Fragen und mein Testcode hat sicher noch keine synchronisation für das VCL memo enthalten, aber mir ging es hier nur darum wie ich innerhalb eines threads eine komponente createn und auf die ereignisse reagieren kann.

Das Threads nicht einfach zu implementieren sind und die fehlersuche ein Graus ist, ist mir klar. Aber soll man deshalb darauf verzichten ?
Ich versuche mich halt mit trial an error an die Sache ranzutasten und so ein simples Bsp
wie von Angel4585 bringt mich persönlich deutlich schneller voran. Luckies Tutorial ist zum
Einstieg sehr gut und ich habe hier mindestens 15 Delphi Bücher stehen die zum thema threads nicht annähernd an den Inhalt von Luckie herankommen.. aber bei diesem Problem hat mich weder ein Buch noch Luckies Tut weitergebracht

So Long und nochmals Danke für die Hilfe

Ralf

P.S. zum fehlenden Synchronize für den Schreibzugriff aufs memo kann man aber auch sagen dass es in diesem Fall unnötig ist da sowieso nichts anderes auf die VCL zugreift - ja das kann bei späteren Änderunen zu Problemen führen - aber man spart auch einige CPU-Zyklen man kann sich mit critical sections und synchronize ja auch ziemlich ausbremsen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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