Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 044

/ вопрос решён /

Приветствую, уважаемые эксперты!
Ищу метод реализации таймера в DLL. Пробовал Settimer:

var
timer1:integer;
H: HWND;

...
timer1:=SetTimer(H, 0, 5000, @Func);

...
procedure Func(hWnd: THandle; uMsg: DWord; idEvent: DWord; dwTime: DWord); stdcall;
begin
//делаем дела
killtimer(0,timer1);
end;

Такой метод дает сбой (если таймер срабатывает, то идет по кругу, не уничтожается после первого выполнения Func). Может где-то ошибка закралась, прошу поправить либо подсказать другое решение. Заранее благодарю!

Phoenix Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 26 июля 2009, 22:34
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Phoenix!
Использовать SetTimer в длл - плохая затея. Если внимательно MSDN читали, то узнали бы, что эта функция для работы требует окна. потому что она работает через посылку сообщения WM_TIMER. А когда встречаются длл и делфовское приложение - тут начинаются всегда пляски. Хотя и для С++ приложения тут тоже плохо. Рекомендую закинуть это дело, потому что до хорошего довести вряд ли получиться и сделать как положено - через тред. а в треде можно использовать Sleep и им регулировать задержки на нужное время (sleep с потоками - самое оно. потому что он как бы "отключает тред на указанное время и тред не кушает системных ресурсов. 100 тредов, которые спят в sleep кушают только оперативную память и буквально чучуть процессора для проверки очереди).
Второе "за тред" - можно легко делать разные нестандартные вещи, которые на таймерах делаются очень сложно.
По тредам статьи есть на этом сайте.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 27 июля 2009, 03:18
Оценка за ответ: 5

Комментарий к оценке: обязательно попробую через поток!

Ответ #2. Отвечает эксперт: min@y™

Если у тебя H: HWND — это сущетвующее окно (его хэндл), и ты передаёшь его в функцию SetTimer(), то для убиения таймера этот хэндл требуется передавать и в функцию KillTimer(), а ты передаёшь 0. Внимательно читай хэлп: тогда не будет необходимости задавать такие вопросы.

Цитата:


The KillTimer function destroys the specified timer.

  BOOL KillTimer(
    HWND hWnd,  // handle of window that installed timer
    UINT uIDEvent   // timer identifier
   );


Parameters

hWnd

Identifies the window associated with the specified timer. This value must be the same as the hWnd value passed to the SetTimer function that created the timer.

uIDEvent

Specifies the timer to be destroyed. If the window handle passed to SetTimer is valid, this parameter must be the same as the uIDEvent value passed to SetTimer. If the application calls SetTimer with hWnd set to NULL, this parameter must be the timer identifier returned by SetTimer.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 27 июля 2009, 08:22
Оценка за ответ: 5

Комментарий к оценке: да, H - хэндл главного окна хост-приложения, вот значит где ошибка, спасибо.

Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.