Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 Uhr.
Seite 1 von 2  1 2      

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