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 erster versuch mit threads (https://www.delphipraxis.net/45164-erster-versuch-mit-threads.html)

DGL-luke 30. Apr 2005 23:51


erster versuch mit threads
 
Habe soeben versucht, meinen ersten thread auf die beine zu stellen. der zweck dieses threads ist es, eine evtl. große zahl von dateinamen einzulesen uind zu manipulieren.

ich habe einfach mal "neues theread objekt" gemacht und alles, was mir relevant erschien, aus der erstellten unit in meine hauptunit kopiert (erster fehler ?!)

dann habe ich einige globale variablen gemacht, auf die der thread zugreifen darf (zweiter fehler?!)

und nun bekomme ich eine AV an adresse 00000000 :mrgreen:

ich zeig euch mal n bisschen code, nur um zu fragen, ob das denn so überhaupt funktionieren kann......

Delphi-Quellcode:
type
  TCheckThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  end;

var
  MainForm: TMainForm;
  pop:boolean = false;
  Check: TStringList;
  Checked:TStringList;
  CheckBlocked:boolean=true;
  CheckThread:TCheckThread;
  ToLower:boolean=true;

implementation

{$R *.dfm}

procedure TCheckThread.Execute;
var bad,good:TStringList;
    i,k,count:integer;
    smallcheck:string;
    flags:TReplaceFlags;
    result:TStringList;

begin
  { Thread-Code hier einfügen }

flags:=[rfReplaceAll];
if not checkblocked then
 begin
  result:=TStringList.Create;

  checkblocked:=true;
  routines2.explode(check[0],'|',bad);       //search-ausdrücke extrahieren
  routines2.explode(check[1],'|',good);      //replace-ausdrücke extrahieren

  //...
  //unkritischer code(hoffe ich)
  //...

   mainform.MProtocol.Lines.Add('Check durchgeführt. Unterschiede: '
     + inttostr(strcomp(result.gettext,check.GetText)));
 end
else mainform.MProtocol.Lines.Add('thread abgebrochen. Kein Zugriff auf Checkliste');
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 checkthread:=tcheckthread.Create(true);
 checkthread.FreeOnTerminate := true;

 Check:=TStringList.Create;
 Checkblocked:=false;

end;

procedure TMainForm.BSingleOpenClick(Sender: TObject);
begin
check.Assign(readdir(stv1));
check.Insert(0,'ä| ');  //bad
check.Insert(0,'ae|_'); //good
checkthread.Execute;
end;
hoffe, der code reicht.
wird durch aufrufen der execute-methode denn überhaupt der thread ausgeführt, oder nur innerhalb des hauptthreads ausgeführt?

jfheins 30. Apr 2005 23:58

Re: erster versuch mit threads
 
Mit Execute wird's im Hauptthread aufgerufen, aber das problem ist (soweit ich das jetzt sehe), dass du das Threadobjekt nicht erstellst. (Dann wird's auch im seperaten Thread abgearbeitet ...)

Mephistopheles 1. Mai 2005 00:16

Re: erster versuch mit threads
 
jfheins meint (Hervorhebung von mir):
Mit Execute wird's im Hauptthread aufgerufen, aber das problem ist (soweit ich das jetzt sehe), dass du das Threadobjekt nicht erstellst. (Dann wird's auch im seperaten Thread abgearbeitet ...)
War das nicht Synchronize()? Ich dachte Execute() ist gerade das, was innerhalb des Threads läuft.

Dax 1. Mai 2005 00:35

Re: erster versuch mit threads
 
Im gegebenen Kontext hat Heinz schon recht, Mephisto. Wird in einem Thread die Execute() eines TThread-Nachkommens aufgerufen, wird Execute() im aufrufenden Thread ausgeführt, nicht in nem separaten ;)

Mephistopheles 1. Mai 2005 01:30

Re: erster versuch mit threads
 
Weil er den Constructor nicht aufgerufen hat, oder wie? Ich habe TThread ehrlich gesagt nie benutzt.

jfheins 1. Mai 2005 08:26

Re: erster versuch mit threads
 
Zitat:

Zitat von Mephistopheles
Weil er den Constructor nicht aufgerufen hat, oder wie?

Genau :thumb:

Entweder den Constructor mit CreateSuspended := FALSE aufrufen, oder mit TRUE und danach resumen, dann läuft's in nem seperaten Thread ab ...

Luckie 1. Mai 2005 12:05

Re: erster versuch mit threads
 
Falls ein Tutorial gesucht wird: http://tutorials.luckie-online.de

Mephistopheles 1. Mai 2005 13:17

Re: erster versuch mit threads
 
Zitat:

Zitat von jfheins
Zitat:

Zitat von Mephistopheles
Weil er den Constructor nicht aufgerufen hat, oder wie?

Genau :thumb:

Entweder den Constructor mit CreateSuspended := FALSE aufrufen, oder mit TRUE und danach resumen, dann läuft's in nem seperaten Thread ab ...

Okay, danke. Irgendwie finde ich das schon krank. In C++ müßte man die Methode wenigstens als static deklarieren, damit sie "außerhalb" einer Instanz der Klasse aufgerufen werden kann. Eigenartiges Verhalten bei Delphi - habe ich so noch nicht gewußt.

DGL-luke 1. Mai 2005 14:07

Re: erster versuch mit threads
 
Zitat:

Zitat von jfheins
Mit Execute wird's im Hauptthread aufgerufen, aber das problem ist (soweit ich das jetzt sehe), dass du das Threadobjekt nicht erstellst. (Dann wird's auch im seperaten Thread abgearbeitet ...)

Zitat:

Zitat von DGL-luke
checkthread:=tcheckthread.Create(true);

hab ich doch im oncreate meiner mainform schon gemacht ?!

aber das mit resume leuchtet mir ein.

Mephistopheles 1. Mai 2005 14:32

Re: erster versuch mit threads
 
Der Punkt ist, daß nach dem Erstellen des Threads (und ggf. Resume) der TThread automatisch die Execute-Methode aufruft. Die brauchst du explizit nicht mehr aufrufen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Seite 1 von 2  1 2      

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