Hi ihr,
mir brummt der Kopf. Ich versuche gerade, die
DriveTools.pas (Direktlink) von Luckie in einen Thread auszulagern, da ich bei meinem Programm (
nonVCL, mal wieder
) im Hintergrund einen definierten Ordner einlesen möchte. Mein Versuch sieht bis jetzt so aus:
Delphi-Quellcode:
(*| 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;
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?
//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...