Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.014 c
14-1133048630
Fl@sh
2005-11-27 02:43
2005.12.18
PIC контроллеры + литература


4-1129897383
Гас
2005-10-21 16:23
2005.12.18
Как в TEdit отключить beep при выходе из этого контрола?


14-1132970523
Юрий Зотов
2005-11-26 05:02
2005.12.18
Просматривая...


1-1132221959
murzik
2005-11-17 13:05
2005.12.18
Общий NumberFormat в Excel-е


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский