Ben de mesai içinde ara ara bakındım ama denemelerimden en makulü bu geldi.
CPU kullanımını %35'den ancak %5'e kadar çekebildim.
Nasıl denedim, 100 milisaniyelik paketler halinde bekleyip Application.ProcessMessages'i öyle verdim.
Başlığı okuyanlar için yazayım, xBool sonsuz döngü demeyin. basit bir senkronize ile bu değişkenden güdümleyerek threadi durdurma imkanımız daima mevcut.
Ref:
bu link
procedure TForm1.Button1Click(Sender: TObject);
procedure AnaThreadDonmadanBuradaYukaridakiThreadiBekleyelim();
Const
iBekleMiliSaniye = 100;
var
Event : THandle;
begin
Event := CreateEvent(nil, False, False, nil);
try
while ( MsgWaitForMultipleObjects(1, Event, False, 100, QS_ALLINPUT) <> WAIT_TIMEOUT )
do begin
Application.ProcessMessages;
end;
finally
CloseHandle(Event);
end;
end;
var
Thrd : TThread;
xBool: Boolean;
begin
Thrd := TThread.CreateAnonymousThread(
procedure
begin
Sleep(10000);
xBool := False;
end
);
xBool := True;
Memo1.Lines.Add('Başladı:' + DateTimeToStr(now));
Thrd.Start;
while xBool do AnaThreadDonmadanBuradaYukaridakiThreadiBekleyelim();
Memo1.Lines.Add('Bitti:' + DateTimeToStr(now));
Memo1.Lines.Add('Thread bitti');
end;