Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.03;
Скачать: CL | DM;

Вниз

Загоны с таймером   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2008-07-03 12:07) [40]

> Loginov Dmitry  (03.07.2008 11:58:37)  [37]

Если этого сообщения нет, то как Виндоус может объеденить?
Это же не Копперфильдовские фокусы.


 
Anatoly Podgoretsky ©   (2008-07-03 12:08) [41]

> Loginov Dmitry  (03.07.2008 11:59:38)  [38]

Я не телепат.


 
Anatoly Podgoretsky ©   (2008-07-03 12:08) [42]

> Юрий Зотов  (03.07.2008 12:01:39)  [39]

Конечно не вопреки, а строго в соответствии с MSDN


 
Loginov Dmitry ©   (2008-07-03 12:15) [43]

в соответствии с MSDN: если для данного таймера уже есть сообщение WM_TIMER в очереди, то новые сообщения WM_TIMER для того же самого таймера в очередь не заносятся, пока не будет обработано первое сообщение WM_TIMER. Или я неверно интерпретирую MSDN?


 
McSimm ©   (2008-07-03 12:19) [44]


> пока не будет обработано первое сообщение WM_TIMER

да, с маленьким уточнением термина "обработано" - в контексте события OnTimer - оно уже обработано при входе в событие.

Впрочем, я не вижу, чтобы это относилось к данному случаю


 
Юрий Зотов ©   (2008-07-03 12:42) [45]

> Loginov Dmitry ©   (03.07.08 12:15) [43]

> если для данного таймера уже есть сообщение WM_TIMER в очереди, то...

Еще раз: в очереди его уже нет. Раз сработал обработчик OnTimer (а он сработал), то вызвавшее его сообщение WM_TIMER из очереди уже удалено.


 
McSimm ©   (2008-07-03 12:54) [46]


> Еще раз: в очереди его уже нет. Раз сработал обработчик
> OnTimer (а он сработал), то вызвавшее его сообщение WM_TIMER
> из очереди уже удалено.
>


Юрий, он имеено так и сказал:

> > Именно этого сообщения в очереди нет. Но есть другие (вопреки
> MSDN)


И судя по логам (я не склонен расценивать всю это ветку как мистификацию), очень похоже, что так и происходит - на момент обработки одного сообщения в очереди есть также и другие 19 штук. Что, если я не ошибаюсь, действительно противоречит MSDN


 
Юрий Зотов ©   (2008-07-03 13:26) [47]

> McSimm ©   (03.07.08 12:54) [46]

В логе написано, что обработчик OnTimer был вызван N раз подряд.  Больше в логе не написано ничего.

Но N идущих подряд вызовов обработчика OnTimer НЕ означают, что в очереди одновременно присутствовало несколько сообщений WM_TIMER.

1. В очередь поступает сообщение WM_TIMER.

2. Оно выбирается и удаляется из очереди (и с этого мгновения ничто не мешает приходу в очередь нового сообщения WM_TIMER).

3. Вызывается обработчик события OnTimer (а в очереди, возможно, уже есть новое сообщение WM_TIMER, либо оно может поступить туда во время выполнения кода обработчика).

4. В обработчике события пишется лог.

Как видим, эта последовательность действительно может повторяться. И в логе действительно будет написано, что обработчик события OnTimer сработал N раз подряд - что вовсе не означает накопления сообщений в очереди WM_TIMER.


 
McSimm ©   (2008-07-03 13:38) [48]

Мне кажется, что в таком случае лог был бы другим.

Там есть временные отметки есть - практически одномоментно выполняются два десятка сообщений.
Кроме того, мне кажется, что последовательность записей в логе была бы иной, т.е. сначала 20 Before а потом 20 After.
А тут мы видим, что после After (т.е. таймер уже деактивирован)  еще куча обработок происходит, при этом таймер по приведенному коду повторно не активируется. Да и нет задержки 50 мс, даже если где-то активируется в неприведенном коде.

В общем, мне лично трудно увязать приведенный лог с моим представлением о работе таймера, разумеется, я понимаю, что это ничего не означает.

Но разобраться хотелось бы. У меня всегда всякое необъясненное чешется :)


 
Loginov Dmitry ©   (2008-07-03 13:42) [49]

Мне удалось сделать минимальное приложение без единой кнопки, в котором данная проблема отлично воспроизводится. Ошибка действительно из-за DCOM.
Если кому хочется проверить, могу скинуть на мыло.


 
Loginov Dmitry ©   (2008-07-03 13:47) [50]


> Но разобраться хотелось бы. У меня всегда всякое необъясненное
> чешется


Отправил пример на adm@delphimaster.ru


 
Anatoly Podgoretsky ©   (2008-07-03 13:48) [51]


> McSimm ©   (03.07.08 13:38) [48]

А нет ли там потоков случайно, прямо или косвенно.


 
Loginov Dmitry ©   (2008-07-03 13:53) [52]


> Отправил пример на adm@delphimaster.ru


Не знаю, дошло ли оно. На всякий случай выслал еще одно с паролем.


 
Leonid Troyanovsky ©   (2008-07-03 14:01) [53]


> Loginov Dmitry ©   (03.07.08 12:15) [43]

> для того же самого таймера в очередь не заносятся, пока
> не будет обработано первое сообщение WM_TIMER. Или я неверно
> интерпретирую MSDN?

Плиз, уточни интерпретируемую статью.

AFAIK, окну не передаются WM_TIMER, WM_PAINT, WM_QUIT,
_до тех пор_, пока не будут обработаны более приоритетные сообщения.
Про WM_PAINT известно, что несколько из присутствующих
в очереди объединяют. А вот про выбрасывание из очереди
experied WM_TIMER я чего-то не припомню.

--
Regards, LVT.


 
Loginov Dmitry ©   (2008-07-03 14:16) [54]


> Плиз, уточни интерпретируемую статью.


http://msdn.microsoft.com/en-us/library/ms927685.aspx


 
MsGuns ©   (2008-07-03 14:33) [55]

>Riply ©   (03.07.08 11:18) [30]
>"Разбирательство" помогает понять суть происходящего и не допускать
>обидных и досадных ляпов в будущем.

В тех случаях, когда оно (разбирательство) способствует решению проблемы и только. Иначе "лыжи на асфальте"

>Грош цена "ПРАКТИКУ", который, столкнувшись с непонятной ему вещью,
>путем шаманства (потому что не понял) убирает странный эфект и идет дальше.

Грош цена повару, который чтобы убедиться, что борщ пересолен (недосолен) не слопает весь котел


 
Юрий Зотов ©   (2008-07-03 14:34) [56]

Microsoft Windows CE 3.0 ?

http://msdn.microsoft.com/en-us/library/ms644901(VS.85).aspx


 
Игорь Шевченко ©   (2008-07-03 17:37) [57]

MsGuns ©   (03.07.08 14:33) [55]

Плохому учишь. Зря


 
MsGuns ©   (2008-07-03 18:43) [58]

>Игорь Шевченко ©   (03.07.08 17:37) [57]
>Плохому учишь. Зря

Забыл добавить имху


 
Loginov Dmitry ©   (2008-07-03 20:13) [59]

Если кому еще интересно:

http://matrix.kladovka.net.ru/dcomandtimersrc.zip  (39 Кб, исходники)

http://matrix.kladovka.net.ru/dcomandtimer.zip (546 Кб, исходники и EXE)


 
Игорь Шевченко ©   (2008-07-03 23:31) [60]


> Если кому еще интересно:


запусти Spy++ или WinSignt и посмотри, какие сообщения каким окнам приходят, узнаешь много интересного.


 
GrayFace ©   (2008-07-05 03:01) [61]

Как я помню, сообщение WM_TIMER в нормальном случае в очередь не поступает, а передается оконной процедуре при выборке сообщений, если установлен флаг. (или я путаю с WM_PAINT?) Есть только мысль, что в DCOM все сообщения берутся из очереди, а потом возвращяются в нее без учета этой особенности.

Юрий Зотов ©   (03.07.08 11:43) [34]
Напиши обработчик по-человески и забудь о "глюках":

procedure TMyForm.MyTimerTimer(Sender: TObject);
begin
MyTimer.Enabled := False;
try
  ... // Здесь делай что угодно и сколько угодно, только не трогай таймер
finally
  MyTimer.Enabled := True;
end;
end;

Почему это более "по-человечески"? Иногда лучше так, иногда по-простому. У меня, вроде, не было ситуации, когда такое полезно.


 
Loginov Dmitry ©   (2008-07-05 09:04) [62]

> Есть только мысль, что в DCOM все сообщения берутся из очереди,
> а потом возвращяются в нее без учета этой особенности.


Наверно так и есть. Ведь есть же костыль, когда в обработчике SendMessage(), вызванном из дополнительного потока (понято о чем речь? :)) нельзя вызывать функции DCOM (вернее, пока такой обработчик не отработает, вообще ниоткуда нельзя обращаться к DCOM). Так может и с таймером что-то из той же оперы.



Страницы: 1 2 вся ветка

Текущий архив: 2008.08.03;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.029 c
2-1215064983
zdm77
2008-07-03 10:03
2008.08.03
поиск в WORD


15-1213366269
AEN
2008-06-13 18:11
2008.08.03
Ищу работу


15-1213775073
Darvin
2008-06-18 11:44
2008.08.03
Вызов подпрограмм из DLL, написанных на C# из Delphi


2-1214939769
maxon
2008-07-01 23:16
2008.08.03
Как создать и работать с двухмерным динамическим масивом?


15-1213769687
БарЛог
2008-06-18 10:14
2008.08.03
Запаролить документ excel 2007 средствами excel