Тема: Windows: Timers

Ответить в теме
Показано с 1 по 9 из 9
  1. Вверх #1
    Посетитель Аватар для Aeore
    Пол
    Мужской
    Адрес
    Black Sea
    Возраст
    38
    Сообщений
    210
    Репутация
    40

    Exclamation Windows: Timers

    Ребята, помогите с таймерами. Вопрос 1: Почему создаются 2 дополнительных потока? Вопрос 2: Как удалить таймер? Я в функции Stop() как не комбинировал удаление таймеров - потоки либо остаются, либо приложение зависает

    Cам таймер работает исправно при этом

    Код(это поток):


    private
    FTimerQueueHandle: THandle;
    FTimer: PHandle;
    ...
    end;

    ...

    procedure TimerFunc(Context: Pointer; Success: Boolean); stdcall;
    begin
    ...
    end;

    procedure TARSThread.Start;
    begin
    ...
    // Срабатывание таймера каждые 5 секунд
    FTimerQueueHandle := CreateTimerQueue;
    CreateTimerQueueTimer(FTimer, FTimerQueueHandle, TimerFunc, nil, 5000, 5000, 0);

    ...
    end;

    function TARSThread.Stop: Boolean;
    begin
    // DeleteTimerQueueTimer(FTimerQueueHandle, FTimer^, 0);
    DeleteTimerQueueEx(FTimerQueueHandle, 0);

    ...
    end;



    // Подсистему таймеров импортировал вот так:
    // --------------------------------------------------------------------------------------
    unit wintimer;

    interface

    uses
    Windows;

    function CreateTimerQueue: THandle; stdcall;
    function CreateTimerQueueTimer(var phNewTimer: PHandle; TimerQueue: THandle;
    CallBack: TWaitOrTimerCallback;
    Parameter: Pointer; DueTime: DWORD; Period:
    DWORD; Flags: ULONG): Integer; stdcall;
    function DeleteTimerQueueTimer(TimerQueue: THandle; Timer: THandle;
    CompletionEvent: THandle): Integer; stdcall;
    function DeleteTimerQueueEx(TimerQueue: THandle;
    CompletionEvent: THandle): Integer; stdcall;


    implementation

    function CreateTimerQueue; external kernel32 name 'CreateTimerQueue';
    function CreateTimerQueueTimer; external kernel32 name 'CreateTimerQueueTimer';
    function DeleteTimerQueueTimer; external kernel32 name 'DeleteTimerQueueTimer';
    function DeleteTimerQueueEx; external kernel32 name 'DeleteTimerQueueEx';


    end.
    * Origin: I live... somewhere in time!


  2. Вверх #2
    Посетитель Аватар для Aeore
    Пол
    Мужской
    Адрес
    Black Sea
    Возраст
    38
    Сообщений
    210
    Репутация
    40
    С потоками вроде разобрался, но удалить таймер до сих пор не получается. Например, вот это(0, т.к. очередь по умолчанию)

    DeleteTimerQueueTimer(0, FTimer^, INVALID_HANDLE_VALUE);

    виснет программу(INVALID_HANDLE_VALUE).
    * Origin: I live... somewhere in time!

  3. Вверх #3
    Посетитель Аватар для Aeore
    Пол
    Мужской
    Адрес
    Black Sea
    Возраст
    38
    Сообщений
    210
    Репутация
    40
    Решил проблему, использовав timeSetEvent aka Multimedia Timer, полностью отказавшись от очередей. Но все же очень интересно в чем был косяк -- расскажите кто знает.
    * Origin: I live... somewhere in time!

  4. Вверх #4
    Постоялец форума Аватар для Guffy
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    49
    Сообщений
    1,356
    Репутация
    256
    ты часом DeleteTimerQueueEx не из самой TimerFunc вызывал? а то она будет ждать сама себя.
    еще если в TimerFunc делается некая длинная задача - полезно
    CreateTimerQueueTimer(FTimer, FTimerQueueHandle, TimerFunc, nil, 5000, 5000, WT_EXECUTELONGFUNCTION);
    Велик и могуч русский язык, а пользоваться некому

  5. Вверх #5
    Посетитель Аватар для Aeore
    Пол
    Мужской
    Адрес
    Black Sea
    Возраст
    38
    Сообщений
    210
    Репутация
    40
    Нет, в том-то и дело, что удаление вызывается из отдельной функции, так что блокирования быть не должно. А работа в time-функции много времени не занимает, да и виснет код даже если функция пустая
    * Origin: I live... somewhere in time!

  6. Вверх #6
    Постоялец форума Аватар для Guffy
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    49
    Сообщений
    1,356
    Репутация
    256
    он у тебя срабатывал хоть раз?
    я пользовал с WT_EXECUTELONGFUNCTION и DeleteTimerQueueEx - и вроде все было нормально.
    хотя нет, однажды был другой глюк (и не у меня на машине) - таймер вообще не срабатывал

    а кстати QueueUserWorkItem работает? как там треадпул поживает

    и еще
    DeleteTimerQueueTimer
    Remarks
    This function cannot be called while the thread is using impersonation. The resulting behavior is undefined.
    Последний раз редактировалось Guffy; 07.05.2009 в 20:03.
    Велик и могуч русский язык, а пользоваться некому

  7. Вверх #7
    Посетитель Аватар для Aeore
    Пол
    Мужской
    Адрес
    Black Sea
    Возраст
    38
    Сообщений
    210
    Репутация
    40
    Цитата Сообщение от Guffy Посмотреть сообщение
    он у тебя срабатывал хоть раз?
    я пользовал с WT_EXECUTELONGFUNCTION и DeleteTimerQueueEx - и вроде все было нормально.
    хотя нет, однажды был другой глюк (и не у меня на машине) - таймер вообще не срабатывал
    Да, таймер работал на ура! Каждые 5 секунд срабатывал как и требовалось

    Цитата Сообщение от Guffy Посмотреть сообщение
    а кстати QueueUserWorkItem работает? как там треадпул поживает
    А вот это не пробовал

    Цитата Сообщение от Guffy Посмотреть сообщение
    и еще
    DeleteTimerQueueTimer
    Remarks
    This function cannot be called while the thread is using impersonation. The resulting behavior is undefined.
    Я это читал в msdn, но, честно говоря, не совсем понял что такое thread is using impersonation. Что за "подражания" он может использовать?
    * Origin: I live... somewhere in time!

  8. Вверх #8
    Постоялец форума Аватар для Guffy
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    49
    Сообщений
    1,356
    Репутация
    256
    Цитата Сообщение от Aeore Посмотреть сообщение
    Я это читал в msdn, но, честно говоря, не совсем понял что такое thread is using impersonation. Что за "подражания" он может использовать?
    impersonation - это не "подражание", а обычно переводится как олицетворение.
    простой пример:
    в некий сервисный процесс, работающий под системной учетной записью приходит вызов (например, через COM) от программы, работающей с учетной записью Вася. серверный поток, обрабатывающий вызов имеет токен васи и может себя временно олицетворить - открывать файлы (и т.д.) от имени "я Вася" - соотвественно права и ораничения будут проверятся как для Васи.
    Велик и могуч русский язык, а пользоваться некому

  9. Вверх #9
    Посетитель Аватар для Aeore
    Пол
    Мужской
    Адрес
    Black Sea
    Возраст
    38
    Сообщений
    210
    Репутация
    40
    Нет, такой механизм я не использую. Потоки запускаются самым что ни есть обычным образом.

    Сейчас рассматриваю возврат к идее с таймерными очередями -- заметил одну "фишку" - если запущена моя программа, а после нее запустить еще одну (trbonet), тот этот самый TRBONet не запускается, завершаясь с критической ошибкой. И аналогично - если сначала запустить TRBONet, а после мою программу, то при срабатывании таймаута я так же получаю ошибку AV в своей программе. Не знаю с чем это может быть связанно..

    В ближайшее время завершу построение и отладку текущего модуля, и, вернувшись к этой проблеме, сообщу результаты.
    * Origin: I live... somewhere in time!


Ответить в теме

Похожие темы

  1. ПРО WINDOWS!
    от SaNyK в разделе Программное обеспечение
    Ответов: 34
    Последнее сообщение: 16.06.2017, 11:15
  2. Одесский WINDOWS
    от Dimichhh в разделе Юмор
    Ответов: 7
    Последнее сообщение: 15.03.2014, 19:46
  3. Фигня с Windows ME
    от Ruslan.V. в разделе Программное обеспечение
    Ответов: 98
    Последнее сообщение: 21.12.2004, 23:25
  4. Очередная дыра в Windows.
    от Lray в разделе Программное обеспечение
    Ответов: 10
    Последнее сообщение: 13.05.2004, 16:22
  5. Windows XP SP2 RC1 (Build 2096)
    от NEtPuMp в разделе Программное обеспечение
    Ответов: 31
    Последнее сообщение: 30.03.2004, 10:13

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения