Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с потоком [D7]


Страницы:   1 2

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 не запустишь, если поток надо запустить именно заново (а не продолжить с прерванного места), то нужно создавать новый объект потока.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо