Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Таймерный кошмар  (Прочитано 11094 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« : 09-04-2006 11:42 » 

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

Есть приложение, которое подгружает библиотеку. Библиотека многопоточная и большую роль там играют таймеры. Связано это с тем, что с определенной периодичностью надо обрабатывать информацию и выводить ее на экран. Вынесено все в библиотеку из-за глобального хука.

Когда приложение было диалогом, никаких проблем не возникало, таймеры ставились и callback'и работали. Теперь приложение сделали однодокументным, ну и в библиотеку напихалось много чего. В результате таймеры в библиотеке устанавливаются, но callback не срабатывает. Пробовал обычные таймеры, мультимедийные, waitable, все одно и то же. Как будто запустился, но не тикает.

Начал проверять последовательно и обнаружил, что если таймеры устанавливать непосредственно в приложении, то все работает замечательно. Если же таймер ставится в библиотеке, даже в DllEntry, то callback не срабатывает Жаль

Вопрос, что могло пойти не так? Может ли это быть связано с тем, что приложение МФЦ, а библиотека на WinApi? Если может, то что делать, чтобы это исправить?
Повторюсь, когда приложение было диалоговым почти с такой же библиотекой все таймеры работали нормально.

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

В общем жду хоть каких-нибудь ответов, а то уже Крыша едет... Уже туплю и готов  Должен же быть выход!!! Главное - кучность!
« Последнее редактирование: 14-12-2007 23:02 от Алексей1153++ » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 09-04-2006 13:40 » 

Единственное мое предположение, что hInstance разный. Покажи лучше код, как ты включаеш таймеры. Когда регистрируеш класс окна в системе, попробуй поставить стиль CS_GLOBALCLASS.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 09-04-2006 13:53 » new

Finch, hInstance разный где?  Здесь была моя ладья...

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

Код:
int TestMultimediaTimer()
{
#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR)
{
// Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes);
return timeSetEvent(10, wTimerRes, MultimediaTimerProc, NULL, TIME_PERIODIC);
}
и Callback
Код:
void CALLBACK MultimediaTimerProc(UINT uTimerID, UINT uMsg,
       DWORD_PTR dwUser, DWORD_PTR dw1,
       DWORD_PTR dw2)
{     static int c = 0;

       c++;
}

Ставлю на callback бряку, и вызываю TestMultimediaTimer, в приложении срабатывает, а в библиотеке - нет. Жаль
До этого пользвался обычными таймерами, ну там и кода-то никакого нет SetTimer и все, ну и callback.

Да и класс окна регистрирую не ручками, а код добавляет студия, ну как для всех MFC приложений. Можно найти конечно и посмотреть... Но мне кажется это не выход, тем более, что с диалогом-то работало, а там я ничего не менял.
« Последнее редактирование: 14-12-2007 23:03 от Алексей1153++ » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 09-04-2006 14:13 » 

Если честно, то просто не верится, что не-оконные таймеры не работают.  Будь добр пример, в котором не срабатывают waitable timer или TimerQueueTimer
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 09-04-2006 14:55 » 

npak, они все не оконные, я хендл никуда не передаю. Multimedia Timer вообще от окна не зависит. Waitable timer я вообще не смог запустить, то есть он вроде как пускается, но callback не работает даже в приложении Жаль А про TimerQueueTimer только сейчас услышал.

Могу конечно еще их попинать, хотя прикручивать разные таймеры уже порядком надоело, сигнатуры у callback'ов разные, да и создаются они все по-разному, даже при тестах очень сильно все замусоривается. Пример-то я могу сделать, но ведь твоей веры от этого не прибавится Улыбаюсь Надо же видеть это все своими глазами, я бы тоже не поверил, если бы мне рассказали.

Сейчас провел следующий эксперимент, создал абсолютно пустую библиотеку, экспортировал из нее только одну функцию, которая запускает тест таймера - та же картина, возвращает правильный идентификатор, но не работает Жаль Похоже, проблема в приложении, только в каком его месте...
« Последнее редактирование: 14-12-2007 23:04 от Алексей1153++ » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines