![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Если два различных Sender a вызывают одно событие [D6]
События © (2002-11-27 13:33:00)Если одновременно два различных Sender"a вызывают одно событие, будет ли вызвана вторая его копия, или то, которое было вызвано первым прервется или как?
Ihor Osov'yak (2002-11-27 14:32:00) [1]2 MBo © (27.11.02 14:27)
(ИМХО, особь статья)
Ох, блин, особь стать... Сори за эмоции, не удержался...
С уважением, Ihor
MBo (2002-11-27 14:27:00) [2]>Ihor Osov"yak
Да, в случае с Application.ProcessMessages (ИМХО, особь статья) это совершенно справедливо. Вот дем. код - надо быстро кликнуть пару раз на кнопку.
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
inc(j);//глобальная интегер
memo1.lines.add("start number "+inttostr(j));
for i:=1 to 1000 do begin
memo1.lines.add(inttostr(i));
application.processmessages;
end;
memo1.lines.add("end number "+inttostr(j));
end;
Ihor Osov'yak (2002-11-27 14:14:00) [3]2 MBo © (27.11.02 13:58) - дык я тоже так решил.
Но тогда Ваш ответ не очень корректен.
Пример (дебильный,даже можно привести аргумент, что пример как не надо в большинстве случаев делать, но все же):
По клику на бутончик запускаем некий цикл, который чего-то считает. Долго. Естественно, чтобы форма не тормозила, чел юзает Application.ProcessMessages. В то время, когда еще работает цыкл от первого клика, юзер щелкает на бутон снова (ибо юный талантливый программер его не заблокировал, ну или может и не недо блокировать по логике программы). Обработчик снова будет вызван (хотя в стеке еще висит старий) - слава умелому юзанию Application.ProcessMessages.
Итого - начинает свою работу "второй екземпляр цикла" - даже не соображу как правильно эту ситуацию терминами обозначить, вопрошающий наверно такую ситуацию имел ввиду под термином "копия". Когда он работу закончит - по стеку откатываемся к "первому екземпляру" ...
То есть Ваше утверждение "Ни копии, ни прерывания - по завершению одного вызовется другое" - как минимум может вопрошающего того немножко обескуражить (неговоря уже о корректности этого высказывания)...
MBo (2002-11-27 13:58:00) [4]>Ihor Osov"yak
Исходя из слова Sender" - я решил, что имеются в виду обработчики
Ihor Osov'yak (2002-11-27 13:50:00) [5]2 MBo © (27.11.02 13:37)
У меня подозрение, что вопрошающий не очень то понимает термины
"событие","прерывание" и т.п.
События (2002-11-27 13:49:00) [6]Народ, мне сейчас уходить нужно, вернусь, объязательно продолжу эту ветку, оказывается все так интересно..
Ihor Osov'yak (2002-11-27 13:47:00) [7]Что такое копия в вашем понимании?
Обработчик - обычный метод, который может быть вызван повторно
через неявную рекурсию. Также очень просто нарватся при не совсем осознаном использовании Application.ProcessMessages в коде обработчика.
Повторный вызов обработчика (в смысле, что в стеке вызовов выше уже есть вызов этого обработчика) никак не влияет на "прерывание" стоящего выше.
Зы. А я еще молчу про многопоточность ....
Зы2. То, что в неких кругах и литературе обработчики делфийских компонент зовутся событиями вносит очень большую путаницу в неокрепшие умы юных кодеров. Но это имхо ...
События (2002-11-27 13:46:00) [8]А как в очередь складывать, ты имеешь ввиду структуру очередь (FIFO)?
Digitman (2002-11-27 13:45:00) [9]
> по сигналу с com-port"a.
Это как ? Компонент что ли какой-то вызывает событие ? Пример кода приводи.
down (2002-11-27 13:44:00) [10]Смотпря как их обрабатывать, можно складывать в очередь, а можно пропускать.
События (2002-11-27 13:40:00) [11]Например событие вызывается по сигналу с com-port"a.
Таких сигналов может прийти очень много с большой скоростью.
Что будет с теми, кот. не успевают оюрабатываться?
Digitman (2002-11-27 13:38:00) [12]никаких прерываний - процедура-обработчик в любом случае выполняется до конца, так , как это предусмотрено ее логикой
MBo (2002-11-27 13:37:00) [13]Одновременно не бывает.
Ни копии, ни прерывания - по завершению одного вызовется другое