![]() |
Luckie's DriveTools in einen Thread auslagern
Hi ihr,
mir brummt der Kopf. Ich versuche gerade, die ![]()
Delphi-Quellcode:
Ich habe die Unit auf die wichtigsten Teile gekürzt. Der Thread funktioniert auch soweit. Allerdings habe ich das Problem, dass das Fenster "ruckelt". Es springt beim Verschieben und reagiert sehr behäbig. Ich fürchte, irgendwo bin ich gestolpert, nur wo? Sieht jemand vielleicht von euch (Luckie? :) ), was ich da verbockt habe?
(*| Copyright (c) 2005 Michael Puff |*)
uses Windows, Messages; type TStringArray = array of string; const {...} type TFindFiles = class(TObject) private fThread: THandle; fThreadID: Cardinal; {...} procedure ThreadProc; {...} public {...} end; var FFTerminate: Boolean; {...} implementation function GlobalThreadProc(Ptr: Pointer): DWORD; begin TFindFiles(Ptr).ThreadProc(); end; constructor TFindFiles.Create(Handle: THandle; RootFolder: string; Mask: string; Recurse: Boolean; Progress: Boolean); begin fThread := BeginThread(nil, 0, @GlobalThreadProc, Self, CREATE_SUSPENDED, fThreadID); FHandle := Handle; FProgress := Progress; FFTerminate := False; if FProgress then Init; end; procedure TFindFiles.Init; begin FCntFolders := 0; FiFolder := 0; FLevel := 0; if FProgress then begin SendMessage(FHandle, FFM_INIT, 0, 0); CountFolders(FRootFolder, FRecurse); Sendmessage(FHandle, FFM_MAXFOLDERS, FCntFolders, 0); end; end; procedure TFindFiles.CountFolders(RootFolder: string; Recurse: Boolean); var hFindFile : THandle; wfd : TWin32FindData; begin {...} end; procedure TFindFiles.Find(Handle: THandle; RootFolder: string; Mask: string; Recurse: Boolean = True); var hFindFile : THandle; wfd : TWin32FindData; begin {...} end; procedure TFindFiles.ThreadProc; begin Find(FHandle, FRootFolder, FMask, FRecurse); SendMessage(FHandle, FFM_FINISH, 0, 0); end; procedure TFindFiles.FindFiles; begin ResumeThread(fThread); end; class procedure TFindFiles.Terminate; begin FFTerminate := True; EndThread(0); end; //Edit: Argh, beim Absenden kam mir einen Idee: In der "Find" - Funktion werden zwei Nachrichten abgesetzt. Einmal, wenn ein Ordner "gefunden" wurde, und einmal bei einer Datei. Auf die Nachricht der Datei reagiere ich, indem ich die ID3-Tags der Datei auslese und in eine SQLite-DB speicher. Das ist offensichtlich der Flaschenhals, denn kommentiere ich diesen Part aus, "ruckelts" nicht mehr. Ich fürchte, jetzt muss ich mir was anderes einfallen lassen... Das Schreiben in die DB muss noch in den Thread... Aiaiai... :gruebel: |
Re: Luckie's DriveTools in einen Thread auslagern
Du weist aber, dass du deine GlobalThreadProc nicht brauchst, sondern auch gleich deine Methode aufrufen kannst (in BeginThread übergeben).
|
Re: Luckie's DriveTools in einen Thread auslagern
Dachte ich mir auch, aber dann bekomme ich den Fehler
Zitat:
Delphi-Quellcode:
function ThreadProc(P: Pointer): DWORD;
|
Re: Luckie's DriveTools in einen Thread auslagern
Delphi-Quellcode:
Mach ich ständig so.
constructor TTest.Create;
var id:Cardinal; begin BeginThread(nil,0,@TTest.Thread,self,0,id); end; function TTest.Thread: Integer; begin end; Was machst du eigentlich mit dem EndThread da? |
Re: Luckie's DriveTools in einen Thread auslagern
Zitat:
Den Thread beim Zerstören des Objekts beenden. Nicht nötig? |
Re: Luckie's DriveTools in einen Thread auslagern
Nicht nötig. Einfach aus der Threadproc rausgehen. Und in deinem Fall verstehe ich den Sinn sowieso nicht.
|
Re: Luckie's DriveTools in einen Thread auslagern
Zitat:
|
Re: Luckie's DriveTools in einen Thread auslagern
ist der Prozess weg, sind auch die Threads und alle möglichen (nicht gemeinsamen) Handles und auch der zugehörige Arbeitsspeicher weg, aber dennoch kann man ja selber noch ordentlich aufräumen.
|
Re: Luckie's DriveTools in einen Thread auslagern
Zitat:
|
Re: Luckie's DriveTools in einen Thread auslagern
Zitat:
@himi: Mein Reden. :mrgreen: Danke. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 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