Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Thread startet aber macht nicht fertig (https://www.delphipraxis.net/77858-thread-startet-aber-macht-nicht-fertig.html)

kaiser1401 12. Okt 2006 09:44

Re: Thread startet aber macht nicht fertig
 
Der Thread ist der einzige zusätzliche Thread neben dem Hauptprogramm.

"Test" wird im Hauptformular aufgerufen (bzw soll aufgerufen werden) und sieht so aus :

Delphi-Quellcode:
procedure TAdvNavForm.Test;
begin
  ShowMessage('TestThreadAufruf');
end;

Sunlight7 12. Okt 2006 09:59

Re: Thread startet aber macht nicht fertig
 
Hab das probiert, bei mir läufts.
Das Meldungsfenster kommt.

Bei Dir nicht? :gruebel:
Zeig mal die ganze Unit.

kaiser1401 12. Okt 2006 10:15

Re: Thread startet aber macht nicht fertig
 
Delphi-Quellcode:
unit UThreadCheckForNew;

interface

uses
  Classes,comctrls,sysutils,dialogs;

type
  TCheckForNewInPostkorbThread = class(TThread)
  private
   fNodeToCheck:string;
   procedure CheckForNew;
   procedure MarkNode;
    { Private-Deklarationen }
  public
   Liste:TStringList;
  protected
    procedure Execute; override;
  end;

implementation

uses navform;

{ TCheckForNewInPostkorbThread }

procedure TCheckForNewInPostkorbThread.checkfornew;
 var
  node:string;
  search:TDVSearch; // eigene Komponente die hier aber nichts zur Sache tut
  i : integer;
  res:integer;
begin
  search:=TDVSearch.Create(nil);
  for i:=0 to Liste.Count-1 do
   begin
    node:=trim(Liste.Strings[i]);
    res:=search.SRVSearch;
    if res <> 0 then
     begin
      factive:=false;
      MessageDlg('Es ist ein Fehler aufgetreten',mtError,[mbok],0);
      break;
     end;
    if search.Items.Count > 0 then
     begin
      fNodeToCheck:=node;
      Synchronize(markNode);
     end;
   end;
  search.Free;
end;

procedure TCheckForNewInPostkorbThread.Execute;
begin
  CheckForNew;
  Liste.Free;
end;


procedure TCheckForNewInPostkorbThread.MarkNode;
begin
 AdvNavForm.Test;
end;

end.

Sunlight7 12. Okt 2006 10:21

Thread startet aber macht gleich fertig
 
Der Fehler liegt wo anders...

Das kann nicht funktionieren weil...
Delphi-Quellcode:
procedure TCheckForNewInPostkorbThread.Execute;
begin
  CheckForNew;
  Liste.Free;
  // ... Du da raus fliegst
end;
So geht's:
Delphi-Quellcode:
procedure TCheckForNewInPostkorbThread.Execute;
begin
  While not Terminated do begin
     CheckForNew;
     Sleep(1000); // Verschnaufpause, damit der Thread nicht mit 100% CPU läuft.
     // Da fliegst Du nicht mehr raus
  end;

  Liste.Free;
end;

kaiser1401 12. Okt 2006 10:32

Re: Thread startet aber macht nicht fertig
 
Das ich nach einem Durchlauf rausfliege ist momentan schon in Ordnung nur müsste die Methode "markNode" doch trotzdem einmal durchlaufen werden, oder?

Sunlight7 12. Okt 2006 10:36

Re: Thread startet aber macht nicht fertig
 
Wenn "search.Items.Count>0" True ergibt schon.

Versuch mal ob's dann funkt: (search.Items.Count>0) or True
Dann weißt Du ob's generell funkt oder nicht.

kaiser1401 12. Okt 2006 10:43

Re: Thread startet aber macht nicht fertig
 
Es ist größer 0. Wie gesagt, ich komme ja ohne Probleme bis ...

Delphi-Quellcode:
    if search.Items.Count > 0 then
     begin
      fNodeToCheck:=node;
        // ...hier !!
      Synchronize(markNode);
     end;
Nur danach ist dann Schluss. In "MarkNode" geht er nicht rein und in Synchronize auch nicht.

Sunlight7 12. Okt 2006 10:56

Re: Thread startet aber macht nicht fertig
 
Wo hast Du die StringList her?

Die wird in dem Thread niergends erstellt.

Zeig auch mal die Unit navform.

kaiser1401 12. Okt 2006 11:06

Re: Thread startet aber macht nicht fertig
 
Komplett ist die zu groß, aber hier mal die relevanten Teile:
Delphi-Quellcode:
unit NavForm;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, OleCtrls, SHDocVw, ComCtrls, ImgList, ExtCtrls, MyFunct, uBase,
  uGroup, uDocumentType,vgbConstants,uconst, uRepository,vgbfunctions,usearch,
  main, uthreadcheckfornew;

type
  TAdvNavForm = class(TForm)
    // ...
    procedure FormCreate(Sender: TObject);
    procedure Test;
  private
   chkfrnw : TCheckForNewInPostkorbThread;
  end;

var
  AdvNavForm: TAdvNavForm;

implementation

uses logoform,global, DateUtils, UInfo;

{$R *.DFM}


procedure TAdvNavForm.FormCreate(Sender: TObject);
// ...
  chkfrnw:=TCheckForNewInPostkorbThread.Create(true);
  chkfrnw.Liste:=TStringList.Create;
  chkfrnw.Liste.Assign(vgbAvailablePostkoerbe); // vgbAvailablePostkoerbe ist eine bestehende Stringlist
// ...
  chkfrnw.Resume;
end;

procedure TAdvNavForm.Test;
begin
  ShowMessage('TestThreadAufruf');
end;

end.

Sunlight7 12. Okt 2006 11:19

Re: Thread startet aber macht nicht fertig
 
Das sollte man nicht machen:

Delphi-Quellcode:
chkfrnw.Liste:=TStringList.Create;
chkfrnw.Liste.Assign(vgbAvailablePostkoerbe);
Besser wäre es, die StringListe als Parameter in der Create Methode des Threads zu übergeben, da sie sonst ein Teil des VCL Threads ist und aber ohne Synchronize in Deinem Thread verwendet wird.
Außerdem startet der Thread bevor/während/nachdem die Liste erstellt wird, dies ist eine potentielle Fehlerquelle.

PS: Wenn Du die StringListe aus dem Thread heraus vom VCL Thread Updaten mußt, nur über Synchronize.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.
Seite 2 von 3     12 3      

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