Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

Потоки.   Найти похожие ветки 

 
дед Маздай   (2008-11-12 22:57) [0]

Это моя первая, так сказать, проба пера. Посмотрите пожалуйста код.

unit Unit1;
...
type
 TForm1 = class(TForm)
   btn_StartThread1: TRzButton;
   btn_StartThread2: TRzButton;
   btn_StopThread1: TRzButton;
   btn_StopThread2: TRzButton;
   btn_PauseThread1: TRzButton;
   btn_PauseThread2: TRzButton;
   ProgressBar1: TProgressBar;
   ProgressBar2: TProgressBar;
   Label1: TLabel;
   Label2: TLabel;
...
var
 Form1: TForm1;
 Thread1, Thread2: TMyThread;

const
 MaxProgress = 1000;

implementation

procedure TForm1.btn_StartThread1Click(Sender: TObject);
begin
 btn_StartThread1.Enabled := False;
 Thread1 := TMyThread.Create(Label1, ProgressBar1, True);
 ProgressBar1.Position := 0;
 ProgressBar1.Max := MaxProgress;
 Thread1.Resume;
end;

procedure TForm1.btn_PauseThread1Click(Sender: TObject);
begin
 if Thread1.Suspended then begin
   Thread1.Resume;
   btn_PauseThread1.Caption := "Pause";
 end
 else begin
   Thread1.Suspend;
   btn_PauseThread1.Caption := "Resume";
 end;
end;

procedure TForm1.btn_StopThread1Click(Sender: TObject);
begin
 Thread1.Terminate;
 btn_StartThread1.Enabled := True;
end;

procedure TForm1.btn_StartThread2Click(Sender: TObject);
begin
 Thread2 := TMyThread.Create(Label2, ProgressBar2, True);
 btn_StartThread2.Enabled := False;
 ProgressBar2.Position := 0;
 ProgressBar2.Max := MaxProgress;
 Thread2.Resume;
end;

procedure TForm1.btn_PauseThread2Click(Sender: TObject);
begin
 if Thread2.Suspended then begin
   Thread2.Resume;
   btn_PauseThread2.Caption := "Pause";
 end
 else begin
   Thread2.Suspend;
   btn_PauseThread2.Caption := "Resume";
 end;
end;

procedure TForm1.btn_StopThread2Click(Sender: TObject);
begin
 Thread2.Terminate;
 btn_StartThread2.Enabled := True;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 if Thread1 <> nil then begin
   Thread1.Terminate;
 end;
 if Thread2 <> nil then begin
   Thread2.Terminate;
 end;
end;

------------
unit Unit2;
...
type
 TData = record
   dLabel: TLabel;
   dProgress: TProgressBar;
 end;

 TMyThread = class(TThread)
 private
   FData: TData;
   FLabelCaption: string;
   FProgresValue: Integer;
   procedure UpdateProgress;
   { Private declarations }
 protected
   procedure Execute; override;
 public
   constructor Create(Lab: TLabel; Progr: TProgressBar; CreateSuspended: Boolean);
 end;

implementation

uses
 Unit1;

constructor TMyThread.Create(Lab: TLabel; Progr: TProgressBar; CreateSuspended: Boolean);
begin
 inherited Create(CreateSuspended);
 FData.dLabel := Lab;
 FData.dProgress := Progr;
end;

procedure TMyThread.Execute;
var
 I: Integer;
begin
 FreeOnTerminate := True;
 for I := 0 to MaxProgress do begin
   sleep(10);
   FLabelCaption := "Значение: " + IntToStr(i);
   FProgresValue := i;
   Synchronize(UpdateProgress);
   if Terminated then
     Break;
 end;
end;

procedure TMyThread.UpdateProgress;
begin
 FData.dLabel.Caption := FLabelCaption;
 FData.dProgress.Position := FProgresValue;
end;


Всё ли правильно? Меня смущает один момент. Если поток поставлен на паузу ии происходит закрытие формы всё ли правильно закрывается?
Просто EurekaLog (http://www.eurekalog.com/) показывает "Memory Leak: Total size=102 - Count=2." если на паузе один поток и "Memory Leak: Total size=204 - Count=4.", если два. А если оба остановлены (кнопками btn_StopThread1 и btn_StopThread2 соответственно), то всё нормально.


 
Loginov Dmitry ©   (2008-11-12 23:25) [1]

> показывает "Memory Leak: Total size=102 - Count=2." если
> на паузе один поток и "Memory Leak: Total size=204 - Count=4.",
> если два. А если оба остановлены (кнопками btn_StopThread1
> и btn_StopThread2 соответственно), то всё нормально.


А что собственно ожидалось? Потоки были созданы, затем их остановили!!! Поток не ме может завершиться в остановленном состоянии. Либо его завершать с помощью TThread.Free() (но перед этим следует сбросить FreeOnTerminate), либо выполнить TThread.Terminate, затем TThread.Resume, затем дождаться завершения его работы.



Страницы: 1 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.024 c
15-1224078829
БарЛог
2008-10-15 17:53
2008.12.21
PHP imagecopymerge


15-1224814529
Slider007
2008-10-24 06:15
2008.12.21
С днем рождения ! 24 октября 2008 пятница


15-1224771691
Василий Жогарев
2008-10-23 18:21
2008.12.21
Проблемы с кодировкой двух баз...


15-1224734244
Slider007
2008-10-23 07:57
2008.12.21
С днем рождения ! 23 октября 2008 четверг


15-1224490553
Михаил2
2008-10-20 12:15
2008.12.21
Unicode, зачем так сделано