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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Таймерный кошмар  (Прочитано 11011 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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 » 

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 » new

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