![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с потоком [D7]
de_guta © (2011-10-29 11:36:00)создаю поток при открытии формы
NewThread:=TNewThread.Create;
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpNormal;
он сразу же запускается, так и нужно.
procedure TNewThread.Execute;
begin
Form2.AutoMode; // Тут куча всяких действий, вложенные ц иклы , задержки, ожидания
end;
далее нужно чтоб по нажатию FormKeyDown в зависимости от клавиши происходили те или иные действия, пишу:
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
vk_f4:
begin
NewThread.Terminate;
//?нужен NewThread.WaitFor;
NewThread.Resume;
end;
vk_escape:
Form2.close;
вобщем нужно при нажатии клавиши прервать выполнение всех действий в потоке и начать выполнять его занова. Когда выполняется Terminate , на экране код функции Form2.AutoMode все равно продолжает свою работу, хотя vk_escape форму закрывает нормально ,не зависает.
Помогите разобраться.
Сергей М. (2011-10-29 12:57:00) [21]
NewThread.Terminate;
//?нужен NewThread.WaitFor; // не нужен при FreeTerminate = True
NewThread.Resume; // команда потенциальному трупу - "проснись и доделай свои дела" ?)
Anatoly Podgoretsky (2011-10-29 12:53:00) [22]Почему будущих, когда текущих.
sniknik (2011-10-29 12:40:00) [23]> зачем он тогда нужен
подымает "флаг" по которому внутри потока программист прерывает его там где ему нужно... а не посередине транзакции например.
есть внешний терминейт который для "срубания" зависших "впавших" в бесконечный цикл... только он для НЕШТАТНОГО завершения, и после такого программу обычно перестартуют.
> procedure TNewThread.Execute;
> begin
> Form2.AutoMode; // Тут куча всяких действий, вложенные ц иклы , задержки, ожидания
> end;
в курсе что vcl не потоко безопасен? т.е. это у тебя рассадник будущих возможных глюков. (отсутствие реакции на Terminate, это "только первая ласточка" ;)
Dimka Maslov (2011-10-29 12:38:00) [24]
> хм, если Terminate не останавливает поток , зачем он тогда
> нужен
Чтобы передать потоку, что он должен штатным образом прекратить работу. Потому что при силовой остановке потока возможна утечка ресурсов. Если же мы хотим приостановить поток, что-то сделать, а потом запустить, надо ему сначала сделать Suspend, потом Resume. И не забыть про правильную синхронизацию. А то получим deadlock.
Anatoly Podgoretsky (2011-10-29 12:37:00) [25]Поверь он нужен.
de_guta (2011-10-29 11:53:00) [26]хм, если Terminate не останавливает поток , зачем он тогда нужен
Внук (2011-10-29 11:48:00) [27]Во-первых, Terminate сам по себе поток не остановит. Код метода Execute (или там AutoMode) должен проверять флаг Terminated и реагировать соответствующим образом. Во-вторых, терминированный поток с помощью Resume не запустишь, если поток надо запустить именно заново (а не продолжить с прерванного места), то нужно создавать новый объект потока.