![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 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