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

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

Процессы [D7]


Страницы:   1 2

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
аккурат неделю назад...   :о)


Страницы:   1 2

Наверх

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