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.
Пробовал её выполнять отдельным процессом но это не помогло (всеравно подвисает) но я не исключаю что я его не совсем корректно запустил (процесс).


Джо   (2006-12-28 12:05:00) [21]

> [13] Ega23 ©   (28.12.06 12:02)
>
> > Телепатирую. Вероятно, вся работа потока происходит в
> методе,
> >  вызываемом через Synchronize().
> >
>
>
> Мне, кстати, это тоже первое, что пришло в голову...  :о)

Значит, пора уже организовывать Клуб «Любителей» Архангельского :)


Ega23   (2006-12-28 12:02:00) [22]


> Телепатирую. Вероятно, вся работа потока происходит в методе,
>  вызываемом через Synchronize().
>


Мне, кстати, это тоже первое, что пришло в голову...  :о)


Neket   (2006-12-28 12:00:00) [23]

2 Джо: Да нет... Просто методом проб и ошибок. Я впринципе раньше работал с TThread. Но забыл. :-(

2 ALL: Всем спасибо буду пробовать. Если что ещё спрошу.
P.S. Ещё раз всем спасибо.


Desdechado   (2006-12-28 11:43:00) [24]

> Но дело в том что у меня даже нажать на кнопку не получается. Все висит.
Вставь в процедуру опроса (она ж явно циклическая) в каждую итерацию Application.ProcessMessages


Джо   (2006-12-28 11:42:00) [25]

> [7] Neket   (28.12.06 11:35)
> 2 Джо: ЗачОт... :-) Именно так и делал. Если это не правельно
> (что-то мне подсказывает что так оно и есть) то подскажите
> как необходимо сделать.

Syncronize() употребляется для выполнение переданного ей метода в контексте основного потока — того, в котором, собственно, выполняется пользовательский интерфейс (поэтому интерфейс и «виснет»). Соответственно, решение — не выполнять основную работу потока в этом методе, а выполнять его в Execute. Схема проста:

procedure XXX.Execute;
begin
 while not Terminated do
 begin
   //
   // «основная» работа потока
   //

  // если нужно, вызываем Synchronize, чтобы взаимодействовать
  // с основным потоком, например, интерфейсом программы

  // тут проверяем условие выхода из потока,
  // если нужно, вызываем Terminate
 end;
end;

P.S. Телепатирую еще раз. Это Архангельский так научил с TThread работать? :D


jack128   (2006-12-28 11:41:00) [26]

Neket   (28.12.06 11:38) [8]
Ещё одна жертва Архангельского??

Надо так:
procedure SNMP_Q.Execute;
begin
StartOpros;
end;

А в Synchronize выноси, только тот код, который работает с интефейсом...


Neket   (2006-12-28 11:38:00) [27]

procedure SNMP_Q.Execute;
begin

 Synchronize(StartOpros);
 { Place thread code here }
end;


Neket   (2006-12-28 11:35:00) [28]

2 Джо: ЗачОт... :-) Именно так и делал. Если это не правельно (что-то мне подсказывает что так оно и есть) то подскажите как необходимо сделать.


Джо   (2006-12-28 11:32:00) [29]

Телепатирую. Вероятно, вся работа потока происходит в методе, вызываемом через Synchronize().


iXT   (2006-12-28 11:32:00) [30]


> Neket   (28.12.06 11:23) [3]

Thread - это не процесс, а поток (чувствуешь разницу). И чего, как делал? Как останавливал?
Ответ на вопрос ИМХО [1]. Других не задавал, ничего не описал. ???


Neket   (2006-12-28 11:28:00) [31]

2 Desdechado: Я думал по этому поводу... Но дело в том что у меня даже нажать на кнопку не получается. Все висит.


Neket   (2006-12-28 11:23:00) [32]

может я просто не совсем корректно объяснил по поводу процессов. Я использовал Thread Object


Desdechado   (2006-12-28 11:21:00) [33]

Вполне можно обойтись и без потоков.
Просто по нажатию кнопки "стоп" можно выставлять флаг, который время от времени проверять в той самой процедуре, опрашивающей оборудование.


palva   (2006-12-28 11:15:00) [34]

Чтобы не подвисало, нужно запускать процедуру в отдельном потоке (Thread), а не в процессе.
Посмотрите для этого класс TThread. Несложно работать и через API функции (CreateThread и т. д.)


Страницы:   1 2

Наверх

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