Форум: "Основная";
Текущий архив: 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