Посмотрите, все ли правильно, а то вдруг утечки памяти какие и что-то подобное.
Иногда прога подвисает после приостановки и иногда возникает floating point division by zero на строке 73.
И когда останавливаю и потом заново стартую обработка начинается с прошлого места, и это связано с ошибкой выше, хотя вроде как все, что можно чищу.
Код:
type
MyThread = class(TThread)
private
Position: Integer;
protected
procedure UpdateMemo;
procedure UpdateGauge;
procedure Execute; override;
procedure Analys;
end;
var
AnalysThread: MyThread;
CriticalSection: TCriticalSection;
StringList, PathList, ErrorStringList: TStringList;
procedure TForm1.StartProcessClick(Sender: TObject);
begin
if AnalysThread.Suspended
then begin
AnalysThread.Resume;
*****
end
else begin
AnalysThread.Suspend;
******
end;
end;
procedure TForm1.StopProcessClick(Sender: TObject);
begin
AnalysThread.Terminate;
ClearForm;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
try
AnalysThread := MyThread.Create(True);
AnalysThread.FreeOnTerminate := False;
AnalysThread.Priority := tpLower;
CriticalSection := TCriticalSection.Create;
******
except
if Assigned(StringList) then
FreeAndNil(StringList);
*****
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if not AnalysThread.Terminated then AnalysThread.Terminate;
while not (AnalysThread.Terminated) do
begin
Sleep(100);
Application.ProcessMessages;
end;
if Assigned(StringList) then
FreeAndNil(StringList);
****
end;
procedure MyThread.Analys;
begin
try
if AnalysThread.Terminated then Exit;
CriticalSection.Enter;
*****
StringList.LoadFromFile(PathList.Strings[i]);
Synchronize(UpdateMemo);
*****
Position := Round(Form1.Gauge.MaxValue / Form1.ListBox.Count * i);
Synchronize(UpdateGauge);
finally
Synchronize(Form1.ClearForm);
****
CriticalSection.Leave;
end;
end;
procedure MyThread.Execute;
begin
inherited;
while not Terminated do
Analys;
end;
procedure MyThread.UpdateGauge;
begin
Form1.Gauge.Progress := Position;
end;
procedure MyThread.UpdateMemo;
begin
Form1.Memo.Text := StringList.Text;
Form1.Memo.Refresh;
end;