CreateWaitableTimer

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 1 мар 2009.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    На скоко сильно нагрузит систему 120-200 таймеров которые создаються через CreateWaitableTimer ???
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    при этом каждый таймер в среднем срабатывает на интервале от 10сек до 30 минут
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Но все эти таймеры будут работать из 2 потоков.
    тоесть программа->поток>таймера.
    И на скоко точно в таком случаии они будут срабатывать?
     
  4. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Гы... нинаскока не нагрузит.. ля буду.
     
  5. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    И еще вопрос, вот если на середине выполнения одной функ. Таймер вызывает эту же функ. то эта функ. прервет работу свою то: она заново выполниться,
    или у таймера будет эта же функ. но даные сначало сохраняться на предудущем выполнении функ. а потом токо она сначало выполниться. и после этого дальше продолжыт работу функ. с того места где ее прервали?
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Как сделать так чтоб: пока таймер вызвал одну функ. эту же функ. не мог вызвать другой таймер. а после того как первый раз функ. вызваная первым таймером закончит роботу, ее сразу вызывает второй таймер.
     
  7. _int2e_

    _int2e_ New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2009
    Сообщения:
    124
    Тебе в сторону синхронизации копать нужно
    http://www.wasm.ru/article.php?article=1021002
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    XshStasX
    Мда... Чтобы это расшифровать, надо приглашать специалистов по криптоанализу.
    Таймер не вызывает функцию. Он добавляет её в очередь APC. Соответственно исполнение функции при срабатывании таймера не прервётся, если функция, вызванная в результате предыдущего срабатывания, ещё не завершила работу. Очередной вызов функции будет выполнен по окончанию работы функции, выполняющейся по предыдущему вызову.
    Если функция работает дольше интервала срабатывания таймера, то это, вероятно, в какой-то момент приведёт к переполнению очереди APC.

    Добавить в функцию любой синхронизирующий объект: от тривиальной глобальной переменной до критической секции. Зависит от конкретных целей.
     
  9. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Как сделать так чтоб не ожидать пока произойдет событие в таком цыкле:
    Код (Text):
    1. repeat
    2.  WaitForSingleObject(H,INFINITE);
    3.  MessageBox(0,'','',0);
    4. until false;
    а чтоб сама функ. визвалась которую указываешь при создании таймера
    делал я это так:

    Код (Text):
    1. function ACP(p:Pointer;d1,d2:DWORD):bool;stdcall;
    2. begin
    3.  TForm(p).Color:=clred;
    4.   MessageBox(0,'','',0);
    5. end;
    6.  
    7. procedure TForm1.Button1Click(Sender: TObject);
    8. var
    9.  k:Int64;
    10. begin
    11.  h:=CreateWaitableTimer(nil,false,nil);
    12.  k:=-1000;
    13.  SetWaitableTimer(h,k,2000,@ACP,Self,true);
    14. end;
    но функция ACP не вызываеться, в чем я тут ошибся?
    а то при помощи WaitForSingleObject не очень удобно:dntknw:
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    XshStasX
    Поток, выполняющий APC, должен находиться в сторожевом состоянии. Т.е. Вы должны в потоке выполнить SetWaitableTimer, а потом перевести его в сторожевое состояние:
    Код (Text):
    1. repeat
    2.  SleepEx(INFINITE, true);      
    3. until false;
    Тогда указанная в SetWaitableTimer функция по таймеру будет добавляться в очередь APC и тут же выполняться, т.к. поток сразу находится в сторожевом состоянии (второй параметр при вызове SleepEx выставлен в true).
     
  11. Squirrel

    Squirrel New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2009
    Сообщения:
    13
    Всем привет! У меня такая проблема: Мне нужно добиться задержки в 100 мксек. Использую CreateWaitableTimer, SetWaitableTimer, WaitForSingleObject. Но при проверке
    GetTickCount 100 периодов повторения у меня показывает 94..140 мсек. , хотя пишут, что SetWaitableTimer должен работать от 200 нсек. Почему так, и как добиться нужной задержки?
    Использую VC++ 6 Создаю проект как MFC диалог

    Код (Text):
    1. UINT iCnt = 0;
    2.     CString str;
    3.  
    4.     int iTime = -GetTickCount();
    5.  
    6.  
    7.     HANDLE hTimer;
    8.     hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
    9.  
    10.     LARGE_INTEGER delay;
    11.     delay.QuadPart = -100L; //100000 = 1 msec
    12.  
    13.     for(int i = 0; i<100; i++)
    14.     {
    15.         SetWaitableTimer(hTimer, &delay, 0, 0, NULL, 1);    // Установка Задержки
    16.         WaitForSingleObject(hTimer, INFINITE);          // Ожидаем завершения
    17.         CancelWaitableTimer(hTimer);
    18.     }
    19.     CloseHandle(hTimer);
    20.  
    21.     iTime += GetTickCount();
    22.  
    23.     str.Format("%d", iTime);
    24.     AfxMessageBox(str);                     // Выводим сообщение
     
  12. Squirrel

    Squirrel New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2009
    Сообщения:
    13
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Squirrel
    Вместо того, чтобы встревать с одним вопросом в чужие темы, лучше создать свою
    Ответы в пред.теме читал ? Или забыл, где задавал вопрос ?
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ага, спохватился :)