![]() |
Threads zur laufzeit erstellen
Hi,
ich möchte gerne Threads zur laufzeit erstellen, leider komm ich nicht drauf wie das geht :( Vielleicht denke ich auch falsch. Es muss doch pro Thread der typ erstellen werden, oder?
Delphi-Quellcode:
und die Procedure muss ja dann TFlashThreadx.Execute heissen. Kann mir mal einer auf die sprünge helfen wie ich das zur laufzeit mache?
type
TFlashThreadx = class(TThread) procedure Execute; override; end; Vielen dank im voraus |
Re: Threads zur laufzeit erstellen
Hast du dir schon die Tutorials auf
![]() |
Re: Threads zur laufzeit erstellen
Hi,
nein, noch nicht. Ich hatte gegooglt und nix gefunden. Ich dachte es geht so einfach wie ein object zu laufzeit zu erstellen. OFFTOPIC: Wieso bekomme ich keine email-benachrichtugen wenn in "meinen" sachen was geschrieben wird? Der hacken ist im feld. Gruss |
Re: Threads zur laufzeit erstellen
Zitat:
Ist im DP-Profil aktiviert, daß du eMails erhalten möchtest? |
Re: Threads zur laufzeit erstellen
Hmmm,
ich glaube eigentlich dürfte ich garnicht frei rumlaufen :-D War ein anderes mail-konto eingetragen als das was ich abfrage..... Dort lagen die mails. Danke für den hinweiss. Zurück zum topic. ![]() Gruss |
Re: Threads zur laufzeit erstellen
Scheint wunderbar zu klappen.
Vielen Dank..... |
Re: Threads zur laufzeit erstellen
Hi,
vielleicht könnt ihr mal drübersehen. Das ist nur ein kleiner test. Ich weiss das ich den status nicht beachte und man z.b. 2x Start klicken könnte. Es geht mir nur darum ob das soweit ok ist. Eventuell kann es ja auch als vorlage für andere user dienen. Gruss und danke im voraus
Delphi-Quellcode:
EDIT: Was öfters passiert ist, das er die ausgaben links oben auf dem monitor macht. Vielleicht hat einer ne idee wieso er das macht. Das ist ein Snapshoot von oben links.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} type TMyThread = record ThreadID: DWORD; ThreadHandle: THandle; OutPut :TLabel; MyID :Integer; end; var MyThread :Array[0..10] of TMyThread; olabel :Array[0..2] of TLabel; // = (Form1.Label1,Form1.Label2,Form1.Label3); {****************************************************************************** Flashing(varptr: Pointer): LongInt; stdcall - 12/22/2009 4:13 ******************************************************************************} function Flashing(varptr: Pointer): LongInt; stdcall; var i,n :Integer; begin n:=integer(varptr^); for i:=0 to 70 do begin MyThread[n].OutPut.Caption:='Ich bin T#'+IntToStr(n)+' '+IntToStr(i); sleep(700+(n*200)); end; Result:=0; end; {Flashing(zahl: Pointer): LongInt; stdcall} procedure TForm1.Button1Click(Sender: TObject); var i :Integer; begin olabel[0]:=Label1; olabel[1]:=Label2; olabel[2]:=Label3; for i:=0 to 2 do begin MyThread[i].MyID:=i; MyThread[i].OutPut:=oLabel[i]; MyThread[i].ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@Flashing),@MyThread[i].MyID, 0, MyThread[i].ThreadID); if MyThread[i].ThreadHandle<>0 then CloseHandle(MyThread[i].ThreadHandle); end; end; end. ![]() |
Re: Threads zur laufzeit erstellen
Du darfst aus dem Thread nicht auf Komponenten (wie z.B. dein Label) zugreifen, weil diese im Haupt-Thread erstellt wurden. Benutze TThread (siehe Methode Synchronize()) oder, wenn du deinen Thread so starten möchtest, PostMessage(), um mit dem Haupt-Thread zu kommunizieren, damit dieser den Text auf dem Label ändern kann.
Da findet man glaube ich auch mit den passenden Begriffen wie TThread und Synchronize recht viel, vermute ich... oder z.B. mit PostMessage und Thread Synchronisation. HTH |
Re: Threads zur laufzeit erstellen
Hi,
erstmal danke für die hilfe. Ich habe nun gegooglt und mir alles soweit zusammen gesucht. Hier nochmal mein kram. Es läuft meines erachtens einwandfrei. Wär trotzdem nett wenn ihr nochmal drüberschaut. Danke
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg, ExtCtrls; const PM_App = WM_APP + 1; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private procedure PMApp(var Msg: TMessage); message PM_App; { Private-Deklarationen } public { Public-Deklarationen } end; type TMyThread = record ThreadID: DWORD; ThreadHandle: THandle; OutPut :TLabel; MyID :Integer; Count :Integer; end; var Form1: TForm1; implementation {$R *.dfm} var MyThread :Array[0..10] of TMyThread; olabel :Array[0..2] of TLabel; // = (Form1.Label1,Form1.Label2,Form1.Label3); {****************************************************************************** TForm1.PMApp(var Msg: TMessage) - 12/23/2009 12:25 By: DiKo ******************************************************************************} procedure TForm1.PMApp(var Msg: TMessage); var i :Integer; begin i := Integer(Msg.lParam); MyThread[i].OutPut.Caption:='Ich bin T#'+IntToStr(MyThread[i].MyID)+' '+IntToStr(MyThread[i].Count); end; {TForm1.PMApp(var Msg: TMessage)} {****************************************************************************** Flashing(zahl: Pointer): LongInt; stdcall - 12/22/2009 4:13 ******************************************************************************} function Flashing(varptr: Pointer): LongInt; stdcall; var i,n :Integer; begin n:=integer(varptr^); for i:=0 to 70 do begin MyThread[n].Count:=i; PostMessage(Form1.Handle, PM_App, 0, MyThread[n].MyID); sleep(700+(n*200)); end; Result:=0; end; {Flashing(zahl: Pointer): LongInt; stdcall} procedure TForm1.Button1Click(Sender: TObject); var i :Integer; begin olabel[0]:=Label1; olabel[1]:=Label2; olabel[2]:=Label3; for i:=0 to 2 do begin MyThread[i].MyID:=i; MyThread[i].OutPut:=oLabel[i]; MyThread[i].ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@Flashing),@MyThread[i].MyID, 0, MyThread[i].ThreadID); if MyThread[i].ThreadHandle<>0 then CloseHandle(MyThread[i].ThreadHandle); end; end; end. |
Re: Threads zur laufzeit erstellen
Hi!
Delphi-Quellcode:
Ich glaube das ist nicht gut. Übergebe den Wert von Form1.Handle lieber deinem Flashing() als Argument mit.
PostMessage(Form1.Handle, PM_App, 0, MyThread[n].MyID);
Quasi irgendwie so:
Delphi-Quellcode:
und passe die Flashing-Funktion dementsprechend an.
for i:=0 to 2 do
begin MyThread[i].MyID := i; MyThread[i].WindowHandle := Handle; // rubbel die katz MyThread[i].OutPut := oLabel[i]; MyThread[i].ThreadHandle := CreateThread(nil, 0, TFNThreadStartRoutine(@Flashing),@MyThread, 0, MyThread[i].ThreadID); if MyThread[i].ThreadHandle <> 0 then CloseHandle(MyThread[i].ThreadHandle); end; |
Re: Threads zur laufzeit erstellen
Hmmm,
aber ich muss doch bei PostMessage ein Handle übergeben. Und so wie ich gelesen habe muss es das von "form1" sein. Es ist natürlich kein prob das auch in den record mit rein zu nehmen. Aber mit welchses handel soll ich Postmessage dann mitgeben? MyThread[i].WindowHandle? Das ist doch dann im grunde das gleiche, oder irre ich mich??? Gruss |
Re: Threads zur laufzeit erstellen
Ja, ist das gleiche. Es geht halt nur darum, nicht vom Thread auf das VCL-Object (deine Form) zuzugreifen. Deshalb würde ich das so machen. Ich würde meine Hand dafür nicht ins Feuer legen, aber ich glaube auch hier ist der direkte Zugriff darauf unsicher.
Siehe eventuell auch hier: ![]() HTH :) |
Re: Threads zur laufzeit erstellen
Ach deswegen. Wusste ich nicht. Ich werde das so abändern. Wenn das wirklich ein komiges verhalten hat wird es besser sein.
Ich danke dir. Das mit den Threads war ne schwere geburt bei mir. :lol: Aber keine sorge, ich stosse bestimmt noch auf andere sachen die ich nicht auf anhieb kapiere. Das schöne was ich schon immer an TurboPascal bzw. Delphi fand, wenn ich nicht weiter weiss mach ich asm und kann einiges schneller realisieren als in Pascal. Also nicht vom speed her, sondern die umsetzung selber ;) Und ich finde es wesentlich "lesbarer" als C. Gruss und Danke..... Suchbegriffe: Threads Erstellen Laufzeit Parameterübergabe ohne TThreads Beispiel |
Re: Threads zur laufzeit erstellen
Freut mich :) , kein Problem.
Aber wie man ASM lesbarer finden kann als schönen Delphi-Code ist mir wirklich ein Rätsel.. :stupid: Was tiefer als c ist kommt hier nicht auf den Tisch. |
Re: Threads zur laufzeit erstellen
Hehe, ne da hab ich mich falsch ausgedrückt. Delphi find ich lesebarer als C. Sogar assembler finde ich lesbarer als C.
|
Re: Threads zur laufzeit erstellen
Wir kommen uns näher :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 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