Może mi ktoś wytłumaczyć dlaczego jak w wątku odpalę procedurę która tworzy 10 wątków to główny wątek programu jest mocno obciążony, ponieważ forma główna programu bardzo się haczy gdy nią poruszam i zamula drastycznie. Tylko ta forma sam windows i inne aplikacji są ok więc to nie jest obciążenie procesora na 100%
Poniżej kod programu w którym wywaliłem wszystko co te watki robiły a program nadal się tnie.
type
TThreadGetFile = class(TThread)
private
fFileName: string;
public
constructor Create(AFileName: string);
destructor Destroy; override;
property FileName: string read fFileName;
protected
procedure Execute; override;
end;
TThreadDownloader = class(TThread)
private
fIndex: integer;
public
constructor Create;
destructor Destroy; override;
protected
procedure Execute; override;
end;
var
hsDownloader: THandle;
implementation
{ TTaskDownloader }
constructor TThreadGetFile.Create(AFileName: string);
begin
inherited Create(True);
FreeOnTerminate := True;
fFileName := AFileName;
end;
destructor TThreadGetFile.Destroy;
begin
ReleaseSemaphore(hsDownloader, 1, nil);
Inherited;
end;
procedure TThreadGetFile.Execute;
var
dir: string;
begin
try
sleep(100);
except
on E: Exception do
begin
dir := E.Message;
end;
end;
end;
{ TThreadDownloader }
constructor TThreadDownloader.Create;
begin
inherited Create(False);
FreeOnTerminate := True;
end;
destructor TThreadDownloader.Destroy;
begin
Inherited;
end;
procedure TThreadDownloader.Execute;
var
dir: string;
CurrentFile: string;
TotalSize, CurrentTotal: int64;
ListDownload: TList<string>;
I: integer;
HWND: THandle;
ThreadGetFile: TThreadGetFile;
begin
HWND := SendMessage(FindWindow('TTasks', 'Tasks'), WM_AddTask, NativeInt(PChar('Wyszukiwanie nowych zdjęć')), 0);
PostMessage(HWND, WM_SetTaskMarquee, 0, 0);
Synchronize(SetConnection);
ListDownload := TList<string>.Create;
try
(...fragment który wypełnia ListDownload...)
fIndex := 0;
while fIndex < ListDownload.Count do
begin
While WaitForSingleObject(hsDownloader, 200) = WAIT_TIMEOUT do
sleep(100);
ThreadGetFile := TThreadGetFile.Create(ListDownload[fIndex]); //To obciąża
ThreadGetFile.Priority := tpIdle;
ThreadGetFile.Start;
inc(fIndex);
end;
finally
ListDownload.Free;
end;
end;
end;
initialization
hsDownloader := CreateSemaphore(nil, 10, 10, 'SemaphoreThreadDownloader');
finalization
CloseHandle(hsDownloader);