Главная страница
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.033 c
5-1117163646
Rep
2005-05-27 07:14
2005.12.18
Обработка клавиши VK_UP(DOWN) потомком TCustomControl


8-1121283501
melena
2005-07-13 23:38
2005.12.18
пульсирующий шарик


4-1129795229
bva
2005-10-20 12:00
2005.12.18
Считать данные из другого приложения


2-1132782536
Officeman
2005-11-24 00:48
2005.12.18
Вопрос про Hint !!!


2-1133377981
kernef
2005-11-30 22:13
2005.12.18
Помогите разобраться с математикой!