![]() |
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; |
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:
|
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".
|
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 |
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? |
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:
Also das fuppt bei mir.. Er schreibt mir jede Menge in die DateiTTestThread = 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; |
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 05:04 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