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

Вниз

Правильное прерывание потоков   Найти похожие ветки 

 
Andrey02   (2003-06-15 22:59) [0]

При работе потоков, выполнение можно прервать функцией Terminate.

К примеру, чтобы прервать поток по нажатию кнопки -
нужно внутри самого потока ставить перед каждой командой if not Terminated then ...
иначе программа не реагирует на нажатии кнопки (отображает эффект вдавливания, но без действия)

Ставить перед каждой командой if not Terminated не практично и зверски увеличивает код.
Вопрос: Как можно правильно прервать выполнение самого потока?

procedure TMyThread1.Execute;
var
i: integer;
begin
for i:=1 to 10000 do
if not Terminated then Form1.Memo1.lines.add("111");
end;

procedure TForm1.STARTClick(Sender: TObject);
begin
T1 := TMyThread1.Create(False);
end;

procedure TForm1.STOPClick(Sender: TObject);
begin
T1.Terminate;
end;


 
jack128 ©   (2003-06-15 23:22) [1]


> ставить перед каждой командой if not Terminated then ...

другого коректного способа нету. Можно принудительно завершить поток (TerminateThread(...) если не ошибаюсь) но тогда будут проблемы(не высвободятсяресурсы, которые ты захватил в потоке и еще я не знаю как поведет себя твоя ООП оболочка потока)...
Кстати, а что у тебя за код в потоке? Обычно это большой цикл...


 
panov ©   (2003-06-16 00:48) [2]

Код потока написан неверно.
Почитай статьи на этом сайте.


 
DrPass ©   (2003-06-16 01:19) [3]

Неверно, но суть вопроса не в том, как правильно обращаться к компонентам VCL из потока, а как его прерывать.
А тут есть три варианта:
1. Строить алгоритм потока таким образом, чтобы terminated использовалась эффективно.
2. Использовать TerminateThread - не слишком гуманный способ.
3. Забить на эту проблему. Как часто в жизни возникает ситуация, когда необходимо прибивать один поток из другого?


 
alexvan ©   (2003-06-16 08:31) [4]

FreeOnTerminate := True;


 
Polevi ©   (2003-06-16 10:03) [5]

while not Terminated do
...

это самый правильный способ, если поток не использует ф-ий ожидания



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

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

Наверх




Память: 0.47 MB
Время: 0.033 c
1-84129
Maxim Pshevlotsky
2003-06-11 07:39
2003.06.26
Как узнать каталог Windows?


14-84660
Maclud_Maclaud
2003-06-10 13:31
2003.06.26
Неужеле никто не знает как программно регулировать MasterVolume


7-84777
BaSergey
2003-04-15 18:39
2003.06.26
Точка или запятая? Русский или английский?


3-83925
Silver_
2003-06-03 12:15
2003.06.26
if CurrentRecord.IsLocked(ByOtherUser) then...


14-84673
aga
2003-06-10 10:34
2003.06.26
Гитарный процессор