Показать сообщение отдельно
  #15  
Старый 12.03.2014, 16:56
novashdima novashdima вне форума
Новичок
 
Регистрация: 05.02.2010
Адрес: Украина, Киев
Сообщения: 64
Версия Delphi: XE3, XE4
Репутация: 10
По умолчанию

Посмотрите, все ли правильно, а то вдруг утечки памяти какие и что-то подобное.
Иногда прога подвисает после приостановки и иногда возникает 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;
Ответить с цитированием