![]() |
Thread startet aber macht nicht fertig
Hallo,
ich mal wieder :P Und zwar wenn ich mehrere Threads starte zbs. 5.
Delphi-Quellcode:
und in dem Threads zbs. das drin steht:
for I := 1 to 5 do
BeginThread(nil, 0, Addr(Execute), nil, 0, id1);
Delphi-Quellcode:
Dann stehen 5 "#" in dem Memo drin, so wie es sein soll.
procedure Execute;
begin Form1.Memo1.lines.add('start '); Form1.Memo1.lines.add('#'); end; Mach ich aber so:
Delphi-Quellcode:
kommen manchmal nur 1 "#" in dem Memo oder manchmal auch 2.
procedure Execute;
begin Form1.Memo1.lines.add('start '); sleep(100); // Oder irgendwas anderes wo ein bisschen Zeit beansprucht Form1.Memo1.lines.add('#'); end; 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 |
Re: Thread startet aber macht nicht fertig
Das liegt wohl daran das du unsyncronisiert aus dem Thread auf VCL-Elemente zugreifst.
|
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 |
Re: Thread startet aber macht nicht fertig
Könnt Ihr mich auch erklären wie ich das mache ?
Wenn ich
Delphi-Quellcode:
Mache kommt ne Meldung:
procedure Execute;
begin Synchronize([b]I[/b]MachMal); sleep(100); // Oder irgendwas anderes wo ein bisschen Zeit beansprucht Synchronize(MachMal); end; 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 |
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; |
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 ^^ |
Re: Thread startet aber macht nicht fertig
Laß mal lieber, :wall: davon bekommt man nur Kopfschmerzen :zwinker:
Hauptsache jetzt läufts! |
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:
Die Procedure Test sollte in dem anderen Thread nun ein showmessage aufrufen, tut aber nicht. :-(
procedure TCheckForNewInPostkorbThread.MarkNode;
begin AdvNavForm.Test; end; |
Re: Thread startet aber macht nicht fertig
Zeig uns auch bitte noch die Procedure "Test". :)
|
Re: Thread startet aber macht nicht fertig
Zitat:
Meinst Du den VCL Thread oder hast Du noch meherere Threads? Zeig mal mehr Quelltext. :zwinker: |
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; |
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. |
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. |
Thread startet aber macht gleich fertig
Der Fehler liegt wo anders...
Das kann nicht funktionieren weil...
Delphi-Quellcode:
So geht's:
procedure TCheckForNewInPostkorbThread.Execute;
begin CheckForNew; Liste.Free; // ... Du da raus fliegst end;
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; |
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?
|
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. |
Re: Thread startet aber macht nicht fertig
Es ist größer 0. Wie gesagt, ich komme ja ohne Probleme bis ...
Delphi-Quellcode:
Nur danach ist dann Schluss. In "MarkNode" geht er nicht rein und in Synchronize auch nicht.
if search.Items.Count > 0 then
begin fNodeToCheck:=node; // ...hier !! Synchronize(markNode); end; |
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. |
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. |
Re: Thread startet aber macht nicht fertig
Das sollte man nicht machen:
Delphi-Quellcode:
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.
chkfrnw.Liste:=TStringList.Create;
chkfrnw.Liste.Assign(vgbAvailablePostkoerbe); 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. |
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 |
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