Delphi-PRAXiS

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)

rtky_trunks 25. Sep 2006 22:03


Thread startet aber macht nicht fertig
 
Hallo,

ich mal wieder :P
Und zwar wenn ich mehrere Threads starte zbs. 5.
Delphi-Quellcode:
 for I := 1 to 5  do
   BeginThread(nil,
                         0,
                         Addr(Execute),
                         nil,
                         0,
                         id1);
und in dem Threads zbs. das drin steht:
Delphi-Quellcode:
procedure Execute;
begin
  Form1.Memo1.lines.add('start ');
  Form1.Memo1.lines.add('#');
end;
Dann stehen 5 "#" in dem Memo drin, so wie es sein soll.

Mach ich aber so:
Delphi-Quellcode:
procedure Execute;
begin
  Form1.Memo1.lines.add('start ');
sleep(100); // Oder irgendwas anderes wo ein bisschen Zeit beansprucht
  Form1.Memo1.lines.add('#');
end;
kommen manchmal nur 1 "#" in dem Memo oder manchmal auch 2.
Also beendet der Thread nicht richtig?
Kann mir bitte jemand einen kleine Denkanstoß geben, oder den Grund dafür nennen ?

Danke schonmal für's lesen :)
Gruss,
MArc

SirThornberry 25. Sep 2006 22:22

Re: Thread startet aber macht nicht fertig
 
Das liegt wohl daran das du unsyncronisiert aus dem Thread auf VCL-Elemente zugreifst.

Sunlight7 25. Sep 2006 22:23

Re: Thread startet aber macht nicht fertig
 
Du solltest nicht VCL Komponenten aus einem Thread ohne Synchronize verwenden.

Edit: Ups da war einer schneller :zwinker:
Guck mal in der OH in TThread und Synchronize

rtky_trunks 25. Sep 2006 22:28

Re: Thread startet aber macht nicht fertig
 
Könnt Ihr mich auch erklären wie ich das mache ?

Wenn ich
Delphi-Quellcode:
procedure Execute;
begin
   Synchronize([b]I[/b]MachMal);
sleep(100); // Oder irgendwas anderes wo ein bisschen Zeit beansprucht
   Synchronize(MachMal);
end;
Mache kommt ne Meldung:
Missing operator or semicolon
da wo das dicke I ist.

Ich habe schon in der Hilfe nachgeschaut und google auch schon seit 3 Stunden befragt, aber es kommt einfach nichts gescheites raus. Wenn ich es mittels TThread mache kommt genau das gleiche. Deswegen dachte ich, ich nehm wieder BeginThread :P. Aber das geht ja auch nicht...

Danke.
Gruss,
MArc

Sunlight7 25. Sep 2006 22:32

Re: Thread startet aber macht nicht fertig
 
Versuche einen TThread abzuleiten...

Delphi-Quellcode:
procedure TMyThread.Machmal;
begin
   Form1.Memo1.lines.add('...');
end;

procedure TMyThread.Execute;
begin
   Synchronize(MachMal);
end;

rtky_trunks 25. Sep 2006 22:58

Re: Thread startet aber macht nicht fertig
 
Boah, manchmal könnte ich den hier :wall:
Bin ziemlich Felsenfest überzeugt, dass ich das gleich vorhin gemacht habe, und es nicht ging.

Aber hauptsache ist, dass es jetzt funktionukt :)

Danke euch.

Gruss,
MArc

PS: Fragt mich nicht, was ich anderst gemacht habe.... weiss es nämlich selbst nicht ^^

Sunlight7 25. Sep 2006 23:17

Re: Thread startet aber macht nicht fertig
 
Laß mal lieber, :wall: davon bekommt man nur Kopfschmerzen :zwinker:

Hauptsache jetzt läufts!

kaiser1401 12. Okt 2006 09:20

Re: Thread startet aber macht nicht fertig
 
Hallo, Hab da auch so ein änliches Problem. Mein Thread startet Problemlos und läuft bis kurz vor Synchronize. Dann tut sich nichts mehr (in dem thread).


Aufruf des Synchronize: (innerhalb einer Methode die in Execute aufgerufen wird.
Delphi-Quellcode:
 //...
 if search.Items.Count > 0 then
  begin
   fNodeToCheck:=node;
   // bis hier komme ich ohne Probleme
   Synchronize(markNode);
  end;
 //...
Delphi-Quellcode:
procedure TCheckForNewInPostkorbThread.MarkNode;
begin
  AdvNavForm.Test;
end;
Die Procedure Test sollte in dem anderen Thread nun ein showmessage aufrufen, tut aber nicht. :-(

ste_ett 12. Okt 2006 09:26

Re: Thread startet aber macht nicht fertig
 
Zeig uns auch bitte noch die Procedure "Test". :)

Sunlight7 12. Okt 2006 09:39

Re: Thread startet aber macht nicht fertig
 
Zitat:

Zitat von kaiser1401
Die Procedure Test sollte in dem anderen Thread nun ein showmessage aufrufen, tut aber nicht. :-(

Welcher anderer Thread? :gruebel:
Meinst Du den VCL Thread oder hast Du noch meherere Threads?
Zeig mal mehr Quelltext. :zwinker:

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.

kaiser1401 12. Okt 2006 11:33

Re: Thread startet aber macht nicht fertig
 
eigentlich sollte der thread wegen dem create(true) erst beim resume starten...

naja, wegen dem anderen fehler muss ich dann nochmal schauen woran das liegen kann... danke aber schonmal für die hilfe

Sunlight7 12. Okt 2006 11:41

Re: Thread startet aber macht nicht fertig
 
Stimmt, ich hatte den Thread mit False gestartet...
Aber diese Methode ist ohnehin ungesund.

Beispiele für Threads findest Du in dem Verzeichnis DEMOS/THREADS.
Da kannste sehen, wie das gemacht wird.


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