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

Вниз

Как нормально прекратить работу потока   Найти похожие ветки 

 
pound ©   (2005-11-23 22:13) [0]

Имеется проблема с потоком TThread в XP, если я запускаю программу и при запуске активизирую поток, в котором пока ещё ничего не происходит, то программа сильно тормозит, приходится запускать её в режиме совместимости с Win98 (в таком варианте проблем не возникает). Как с этим бороться? На ум пока приходит только активизация потока с первой загрузкой данного потока. Но это ведёт к усложнению алгоритма, а это не желательно.
Активизация потока:
procedure TfmForm1.FormActivate(Sender: TObject);
begin
  SprThr := MyThread.Create(False);
end;
Поток:
type
 MyThread = class(TThread)
 private
   { Private declarations }
 protected
   N: byte; //Счётчик
   procedure Run;
  procedure Execute; override;
 end;
var
 SprThr: MyThread;
Implementation
uses MainForm;
//==================================
begin  //Run
 if fmForm1.BoRun then  //В данной ситуации BoRun := false
   begin
      ……….
      ……….
   end;
end;   //Run
//==================================
procedure MyThread.Execute;
var i: byte;
begin  //MyThread.Execute
 { Place thread code here }
 repeat
   for i := 0 to 7 do
     begin
       N := i;
       Synchronize(Run);
     end;
 until False;
end;   //MyThread.Execute

И ещё один вопрос. Как нормально прекратить работу потока?
procedure TfmForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 SprThr.Suspended := true; //Останавливаю поток
 SprThr.Destroy; //Уничтожаю поток
end;
Как только доходит дело до SprThr.Destroy программа виснет.

Заранее благодарен, Андрей.


 
sniknik ©   (2005-11-23 23:49) [1]

попробуй так

procedure MyThread.Execute;
var i: byte;
begin

 i:= 0;
 while not Terminated do begin
    ....  //работа, один "тик". старайся в только в потоке, синхронизироваться на минимально возможные промежутки (т.к. это все в основном выполняется, т.что с синхронизацией считай потока нет)

    Sleep(0);

    inc(i);
    if i > 7 then i:= 0;
 end;

end;

procedure TfmForm1.FormActivate(Sender: TObject);
begin
 SprThr:= MyThread.Create(False);
 SprThr.FreeOnTerminate:= false;
 SprThr.Resume;
end;

procedure TfmForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 SprThr.Terminate;
 SprThr.WaitFor;
 SprThr.Free;
end;


 
sniknik ©   (2005-11-23 23:52) [2]

да. если  Resume то надо бы,  и SprThr:= MyThread.Create(true); поставить, исправь.


 
Leonid Troyanovsky ©   (2005-11-24 09:47) [3]


> pound ©   (23.11.05 22:13)  

> И ещё один вопрос. Как нормально прекратить работу потока?


Прекратить: SprThr.Terminate

Освободить: Free может потребоваться в случае FreeOnTerminate = False.
Ну, и Free сам делает и Terminate и WaitFor.

Более ничего.
Если, конечно, класс потока написана правильно.

--
Regards, LVT.



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

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

Наверх




Память: 0.48 MB
Время: 0.049 c
4-1129202576
Spellcaster
2005-10-13 15:22
2005.12.18
Собственный хинт в трее


14-1132841824
stone
2005-11-24 17:17
2005.12.18
Супердевайс :))


1-1132759968
Ling
2005-11-23 18:32
2005.12.18
TVirtualStringTree - Ловкость рук и никакого мошенничества


14-1132777064
NightLord
2005-11-23 23:17
2005.12.18
Связь ПО с ПК


2-1132956257
Gala_l
2005-11-26 01:04
2005.12.18
Naity simvol v faile