Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TThread Problem (https://www.delphipraxis.net/49458-tthread-problem.html)

rEzA 11. Jul 2005 20:10


TThread Problem
 
Hi,
ich habe eine problem in TThread klasse der Delphi festgestellt, dazu eine beispiel:

Delphi-Quellcode:
 TMyThread = class(TMyThread)
 private
  FValue,FTrys: integer;
  FGo: boolean;
 protected
  procedure Execute; override;

  procedure Go;
 public
  constructor Create;
 
  procedure Start(Value: integer);
 
  property Trys: integer read FTrys;
 end;

 TForm1 = class(TForm)
  Edit1: TEdit;
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
 end;

 var
  WaitEvent: TEvent;
 
 ...
 ...
 ...
 
 procedure TMyThread.Execute;
 begin
  while not Terminated do
   begin
    if FGo then Go;
    Sleep(1);
   end;
 end;

 procedure TMyThread.Go;
 var
  i: integer;
 begin
  FGo := false;
  i := 0;
  FTrys := 0;
   
  Randomize;

  while (i <> FValue) do //Einfach Random solange aufrufen bis die angegbene zahl rauskommt
  begin
   i := Random(FValue+1);
   Inc(FTrys);
  end;

  WaitEvent.SetEvent;
 end;

 procedure TMyThread.Start;
 begin
  FValue := Value;
  FGo := true;
  FOnNotify := NotifyEvent;
 end;

 
 ...
 ...
 
 WaitEvent := TEvent.Create(...);
 
 ...
 ...
 
 procedure TMainfrm.Button1Click(Sender: TObject);
 var
  Thread: TMyThread;
 begin
  try
   Thread := TMyThread.Create;
   Thread.Resume;
   
   Thread.Start(1564);
   WaitEvent.WaitFor(INFINITE);
   
   Edit1.Text := IntToStr(Thread.Trys);
  finally
   Thread.Free;
  end;
end;

das programm macht nix anderes, als das Main thread solange zu blockiern bis der erzugte thread fertig wird, aber kommischeweise wird der erzugte thread auch blockiert :?, wenn ich jetzt eine thread mit API-Befehl erzeuge geht es, aber ich verstehe nicht wieso :wall:? Das problem ist in Delphi, wenn man mit VCL arbeitet muss man auch TThread benutzen weil der VCL nicht Thread sicher ist. wäre nett wenn jemand mir weiter helfen könnte :) .

Danke,
Reza Golriz

SirThornberry 11. Jul 2005 20:17

Re: TThread Problem
 
warum übergibst du deine "1564" nicht bevor du den Thread mit "Resume" startest? damit würdest du dir erspaaren das du vom Hauptthread unsyncronisiert Variablen in den Thread schreibst.

rEzA 12. Jul 2005 16:16

Re: TThread Problem
 
Zitat:

Zitat von SirThornberry
warum übergibst du deine "1564" nicht bevor du den Thread mit "Resume" startest? damit würdest du dir erspaaren das du vom Hauptthread unsyncronisiert Variablen in den Thread schreibst.

Das soll nur ein Anwendungsbeispiel sein, es ist klar das es fälligen quatsch ist was ich mache, ich wollte nur damit die Problematik beschreiben. Meine Problem ist eigentlich, wenn man die Main thread irgendwie mit WaitforSingleObject oder ein ähnlicher Befehl blockiert, die andere threads, aber wollgemerkt nur die mit TThread erzeugte Objekte auch blockiert werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 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 by Thomas Breitkreuz