![]() |
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:
hoffe, der code reicht.
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; wird durch aufrufen der execute-methode denn überhaupt der thread ausgeführt, oder nur innerhalb des hauptthreads ausgeführt? |
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 ...)
|
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 ...) |
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 ;)
|
Re: erster versuch mit threads
Weil er den Constructor nicht aufgerufen hat, oder wie? Ich habe TThread ehrlich gesagt nie benutzt.
|
Re: erster versuch mit threads
Zitat:
Entweder den Constructor mit CreateSuspended := FALSE aufrufen, oder mit TRUE und danach resumen, dann läuft's in nem seperaten Thread ab ... |
Re: erster versuch mit threads
Falls ein Tutorial gesucht wird:
![]() |
Re: erster versuch mit threads
Zitat:
|
Re: erster versuch mit threads
Zitat:
Zitat:
aber das mit resume leuchtet mir ein. |
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. |
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