Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Threads zur laufzeit erstellen (https://www.delphipraxis.net/144995-threads-zur-laufzeit-erstellen.html)

DelTurbo 21. Dez 2009 18:52


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:
type
  TFlashThreadx = class(TThread)
    procedure Execute; override;
end;
und die Procedure muss ja dann TFlashThreadx.Execute heissen. Kann mir mal einer auf die sprünge helfen wie ich das zur laufzeit mache?

Vielen dank im voraus

SirThornberry 21. Dez 2009 19:24

Re: Threads zur laufzeit erstellen
 
Hast du dir schon die Tutorials auf http://www.delphi-treff.de/ angesehen?

DelTurbo 22. Dez 2009 13:30

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

himitsu 22. Dez 2009 13:45

Re: Threads zur laufzeit erstellen
 
Zitat:

Zitat von DelTurbo
OFFTOPIC: Wieso bekomme ich keine email-benachrichtugen wenn in "meinen" sachen was geschrieben wird? Der hacken ist im feld.

Schon in den Spammails nachgeschaut?
Ist im DP-Profil aktiviert, daß du eMails erhalten möchtest?

DelTurbo 22. Dez 2009 14:42

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. http://www.delphi-treff.de/tutorials...hreads/page/5/ hier ist es sehr gut beschrieben. Aber leider als konsolenanwendung. Ich werd mich da mal durchfummeln. Wenn ich nicht weiterkomme werde ich einfach nochmal fragen.

Gruss

DelTurbo 22. Dez 2009 15:20

Re: Threads zur laufzeit erstellen
 
Scheint wunderbar zu klappen.

Vielen Dank.....

DelTurbo 22. Dez 2009 20:58

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:
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.
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.

http://fli4l.hosting-4-u.de/error.gif

wicht 22. Dez 2009 21:50

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

DelTurbo 23. Dez 2009 12:35

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.

wicht 23. Dez 2009 13:59

Re: Threads zur laufzeit erstellen
 
Hi!

Delphi-Quellcode:
PostMessage(Form1.Handle, PM_App, 0, MyThread[n].MyID);
Ich glaube das ist nicht gut. Übergebe den Wert von Form1.Handle lieber deinem Flashing() als Argument mit.
Quasi irgendwie so:

Delphi-Quellcode:
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;
und passe die Flashing-Funktion dementsprechend an.

DelTurbo 23. Dez 2009 14:17

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

wicht 23. Dez 2009 14:32

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: Thread in der DP

HTH :)

DelTurbo 23. Dez 2009 14:46

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

wicht 23. Dez 2009 14:59

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.

DelTurbo 23. Dez 2009 15:05

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.

wicht 23. Dez 2009 16:09

Re: Threads zur laufzeit erstellen
 
Wir kommen uns näher :)


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