![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ожидание переменной [D7, XP]
allucard © (2007-11-15 10:36:00)Доброго дня.
Поскажите, как организовать ожидание переменной?
function TMTMOle.Config(update: byte): string;
begin
if update=1 then
begin
write_marya_trans('CONF');
while form1.kol_cmd <> 0 do begin end;
end;
result:=form1.Conf.Full_CONF;
end;
Переменной Result нельзя присваивать значение, пока form1.kol_cmd не будет равно 0.
я сделал пустой цикл, а можно как то, чтобы не натупить систему?
Спасибо.
allucard (2007-11-15 12:52:00) [1]Пасиб, буду разбираться.
Сергей М. (2007-11-15 12:49:00) [2]
> не шарю в потоках
При таких вопросах пора бы уже начинать потихоньку "шарить", ибо ты клонишь к параллельности вычислений.
Сергей М. (2007-11-15 12:48:00) [3]
> как это выяснить?
Сравнить GetCurrentThreadId с MainThreadId
allucard (2007-11-15 12:46:00) [4]я не шарю в потоках :(
как это выяснить?
Сергей М. (2007-11-15 12:39:00) [5]
> у него есть событие OnRxChar, и оно срабатывает
Чудесно.
Вот и займись для начала выяснением того, в каком потоке вызывается обработчик этого события.
allucard (2007-11-15 12:36:00) [6]
> Сергей М. © (15.11.07 12:26) [12]
я не реализовывал механизм потоков.
я использовал компонент TComPort, у него есть событие OnRxChar, и оно срабатывает когда приходят данные.
я обрабатываю это событие, в результате чего form1.kol_cmd = 0.
Jeer (2007-11-15 12:29:00) [7]
> так как вызов этой функции (TMTMOle.Config) происходит из
> другой клиентской программы посредством механизма OLE,
Ну поехала перепостановка задачи.
Сергей М. (2007-11-15 12:26:00) [8]
> по приходу данных с ком порта, сработает определённое событие
В каком потоке ?
allucard (2007-11-15 12:01:00) [9]нужно,
1. Или не выходить из процедуры TMTMOle.Config
2. Или зайти в неё снова, с места прихода данных.
1-е просто, но будет подтупливать систему, и мне бы самый менее тупящий систему способ(с циклом + sleep это не выход), в TThread не разбирался, остаётся Application.ProcessMessages().
а 2-й отличный способ, не тупит систему, но я не знаю как его реализовать, так как вызов этой функции (TMTMOle.Config) происходит из другой клиентской программы посредством механизма OLE, и даст ли мне что-то если я её вызову с кода своей серверной программы.
type
TMTMOle = class(TAutoObject)
automated
function Config(update: byte): string;
end;
?
Jeer (2007-11-15 11:55:00) [10]
> allucard (15.11.07 11:50) [9]
> сработает определённое событие
Кто мешает на это событие навесить все что тебе нужно, а не только kol_cmd = 0 ?
allucard (2007-11-15 11:50:00) [11]
> Сергей М. © (15.11.07 11:37) [8]
по приходу данных с ком порта, сработает определённое событие, и данные обработаются, а в результате обработки form1.kol_cmd станет равным 0
Сергей М. (2007-11-15 11:37:00) [12]
> 0 окажется в переменной из другой функции программы через
> секунду
С какого перепугу "из другой функции", если в данныймомент выполняется функция TMTMOle.Config ?
allucard (2007-11-15 11:29:00) [13]
> Anatoly Podgoretsky © (15.11.07 11:16) [5]
0 окажется в переменной из другой функции программы через секунду.
это имели ввиду?
clickmaker (2007-11-15 11:29:00) [14]
> как то, чтобы не натупить систему?
Sleep(), Application.ProcessMessages()
Но лучше глянь в сторону TEvent
Anatoly Podgoretsky (2007-11-15 11:16:00) [15]Про протокол никто не спрашивал, перечитай снова вопрос [3] и пока не будет на него ответа, сказать нечего.
allucard (2007-11-15 10:46:00) [16]
> Сергей М. © (15.11.07 10:41) [3]
Ну, это в протоколе, когда команда с ком порта прийдёт полностью
Сергей М. (2007-11-15 10:41:00) [17]
> пока form1.kol_cmd не будет равно 0
А при каких условиях 0 окажется в этой переменной ?
Юрий Зотов (2007-11-15 10:39:00) [18]См. TThread и TCriticalSection.
Reindeer Moss Eater (2007-11-15 10:38:00) [19]if InputQuery(...) then
....