![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процессы [D7]
Neket © (2006-12-28 11:08:00)Подскажите как лучше сделать. Есть прога которая по таймеру (каждые 15 мин) запускает одну процедуру. Которая работает где-то мин 8-10. (Осуществляет опрос параметров оборудования). И при этом она не "реагирует" на внешнее воздействие (ну типа подвисает). Вопрос в следущем. Как сделать выполнение этой процедуры так чтобы можно в момент её выполнения я мог её остановить. Подскажите пожалуйста возможные варианты решения этого вопроса.
P.S.
Пробовал её выполнять отдельным процессом но это не помогло (всеравно подвисает) но я не исключаю что я его не совсем корректно запустил (процесс).
evvcom (2006-12-29 11:03:00) [1]> [33] Neket (29.12.06 10:59)
А самые работящие могут написать свой или хотя бы скопировать весь код TThread в свой модуль и пользовать его. :)
Neket (2006-12-29 10:59:00) [2]Всем спасибо за помощь.... Разобрался... Попробовал все методы и работают все три но как показала практика что наиболее практичнее для ленивых ;-) писать
DataThread.Free;
Ega23 (2006-12-29 10:55:00) [3]
> Достаточно просто DataThread.Free; во Free проверится Assigned,
> а в Destroy выполнится Terminate и WaitFor
Да? НУ ладно, буду знать, я с потоками мало работал.
EvChul (2006-12-29 10:47:00) [4]Ega23 © (29.12.06 10:32) [28]
А не лучше ли ?
if Assigned(DataThread) then // Если поток создан
begin
DataThread.Terminate; // Послали убийство
DataThread.WaitFor;// Подождали, чтобы убился
end;
evvcom (2006-12-29 10:44:00) [5]> [28] Ega23 © (29.12.06 10:32)
Достаточно просто DataThread.Free; во Free проверится Assigned, а в Destroy выполнится Terminate и WaitFor
evvcom (2006-12-29 10:41:00) [6]> [27] Neket (29.12.06 10:27)
> чтобы в случае закрытия формы TForm1.FormClose при запущенном
> потоке чтобы поток очередную итерацию цикла доработал до
> конца а потом закрылся
Это поток сам проверяет в своем деструкторе. См. исходники.
> при событии OnFormClose отрабатывалась что-то вы этом роде
> >>> if Potok.Terminate=false then Potok.Terminate;
Во-первых,if Potok.Terminate d, а во-вторых, это неважно. Просто делайPotok.Terminate. См. исходники.
Ega23 (2006-12-29 10:32:00) [7]
> т.е. грубо говоря надо чтобы при событии OnFormClose отрабатывалась
> что-то вы этом роде >>> if Potok.Terminate=false then Potok.
> Terminate; Но как это правельно описать я к сожелаения не
> знаю.
if Assigned(DataThread) then // Если поток создан
begin
DataThread.Terminate; // Послали убийство
WaitForSingleObject(DataThread.Handle, 1000); // Подождали, чтобы убился
end;
Neket (2006-12-29 10:27:00) [8]2 ДЖО: Спасибо очень помог...
Но возник ещё один вопрос как определить был ли создан потокsnmp_p.Create(false); ?
Это необходимо чтобы в случае закрытия формыTForm1.FormCloseпри запущенном потоке чтобы поток очередную итерацию цикла доработал до конца а потом закрылся. Да и плюс ко всему, если поток не был создан и закрывается форма то вылитает ошибка
т.е. грубо говоря надо чтобы при событии OnFormClose отрабатывалась что-то вы этом роде >>>if Potok.Terminate=false then Potok.Terminate;Но как это правельно описать я к сожелаения не знаю.
Mickey74 (2006-12-28 21:39:00) [9]Не очень хороший способ, но попробуй:
Application.ProcessMessages;
Джо (2006-12-28 17:22:00) [10]> проверим, если True,
проверим, если Terminated = True
Сорри.
Джо (2006-12-28 17:21:00) [11]Схема словами:
procedure XXX.Execute;
begin
// что-то сделали
// проверим, если True, то выходим из Execute
// что-то сделали
// проверим, если True, то выходим из Execute
// что-то сделали
// проверим, если True, то выходим из Execute
// ...
end;
Джо (2006-12-28 17:19:00) [12]И не забудь перед запуском потока выставить FreeOnTerminate. Тогда экземпляр объекта будет автоматически освобожден.
Джо (2006-12-28 17:19:00) [13]Еще раз.
Terminate — выставляет свойство Terminated в True. Ты в своем цикле (или где-там у тебя обработка) периодически проверяешь этот свойство, и, если оно True, просто выходишь из тела метода Execute.
> [21] Neket (28.12.06 16:58)
> Насколько я понял While not Terminated do Work это остановка
> выполнения процесса.
Нет. Это собственно сама работа твоего потока.
Neket (2006-12-28 16:58:00) [14]2 Джо: Я просто немного запутался с никами...
Насколько я понял While not Terminated do Work это остановка выполнения процесса. Но а как его прибить полностью? К примеру в случае FormClose
пробовал делать так:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Potok.Destroy;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Potok.Terminate;
end;
Но если закрываю приложение то оно у меня зависает. Подскажите пожалуйста где ошибка?
Джо-со-смарта (2006-12-28 16:38:00) [15]Он у меня один в этой ветке.
Ega23 (2006-12-28 16:38:00) [16]TMyTread.Execute
beign
While not Terminated do Work;
end;
Neket (2006-12-28 16:36:00) [17]2 Джо-со-смарта: А какой пример?
Джо-со-смарта (2006-12-28 16:34:00) [18]Смотри мой пример на предмет терминейт. Только помни, что терминейтед -- только флаг и тебе в ходе выполнения потока самому нужно его периодически проверять и выходить из екзекьют.
Neket (2006-12-28 16:16:00) [19]Все вроде заработало... Нотеперь не пойму.... А как правельно "прибить" процесс? т.е.
procedure TForm1.Button1Click(Sender: TObject);
begin
snmp_p.Create(false); // Создаем процесс
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
????????????? // Прибиваем процесс
end;
Ega23 (2006-12-28 12:15:00) [20]
> Значит, пора уже организовывать Клуб «Любителей» Архангельского
> :)
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1166707484&n=3
аккурат неделю назад... :о)