![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процессы [D7]
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 и т. д.)