AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Komponente innerhalb eines Threads erstellen

Komponente innerhalb eines Threads erstellen

Ein Thema von th_bone · begonnen am 27. Jul 2006 · letzter Beitrag vom 27. Jul 2006
Antwort Antwort
th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#1

Komponente innerhalb eines Threads erstellen

  Alt 27. Jul 2006, 14:22
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;
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Komponente innerhalb eines Threads erstellen

  Alt 27. Jul 2006, 14:30
Es heisst nicht (System : TObject) sonder (Sender : TObject) das sollte eigentlich so gehen.. aber macht es sin einen timer im Thread zu erstellen
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#3

Re: Komponente innerhalb eines Threads erstellen

  Alt 27. Jul 2006, 14:36
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".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Komponente innerhalb eines Threads erstellen

  Alt 27. Jul 2006, 14:43
@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
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Komponente innerhalb eines Threads erstellen

  Alt 27. Jul 2006, 14:46
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?
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Komponente innerhalb eines Threads erstellen

  Alt 27. Jul 2006, 14:51
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
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
th_bone

Registriert seit: 16. Jun 2004
172 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Komponente innerhalb eines Threads erstellen

  Alt 27. Jul 2006, 17:14
@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...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:44 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