2013-05-11 4 views
0

Я программирую на C++ с помощью MFC.MFC Timer Одноразовый Execute

Я хочу, чтобы часть кода выполнялась после полной загрузки пользовательского интерфейса, поэтому я поместил ее в обратный вызов OnTimer и назвал SetTimer в OnInitDialog. Проблема в том, как заставить таймер выполнять только один раз?

Любая помощь будет оценена по достоинству.

ответ

2

Вы должны использовать функцию KillTimer, но вам нужно быть осторожным только при выполнении таймера. Например, вы пишете код, как показано ниже,

#define TID_ONLY_ONCE WM_USER + 202 
void CSampleDlg::OnTimer(UINT_PTR nIDEvent) 
{ 
    if(nIDEvent == TID_ONLY_ONCE) 
    { 
     KillTimer(TID_ONLY_ONCE); 
     SomethingLongProcess(pSomeData); 
    } 
    CDialog::OnTimer(nIDEvent); 
} 

Если вы установили истечения таймера в ближайшее время, хотя вы звоните KillTimer, «OnTimer()» будет выполняться несколько раз, потому что SomethingLongProcess требует длительного времени. Таким образом, чтобы избежать этого,

  • Вызвать KillTimer() сразу после вызова SetTimer().
  • Или используйте глобальный элемент bool. После вызова SetTimer глобальный член установил значение true, а затем в OnTimer(), проверьте это значение, будет ли выполняться SomethingLongProcess().

Надеюсь, это поможет вам немного.

+0

Спасибо, используя глобальные работы bool. – l3utterfly

-1

В первый раз, когда функция таймера называется вызовом KillTimer.

+0

Я пробовал это, но таймер по-прежнему выполняется несколько раз, прежде чем убить таймер работает ... – l3utterfly

1

Вместо использования таймера вы также можете отправить сообщение с помощью сообщения PostMessage, которое позволит обрабатывать очередь ожидающих оконных сообщений. Затем вы можете делать то, что хотите, в обработчике PostMessage. Таким образом, вам не нужно беспокоиться об убийстве таймера. (см. http://msdn.microsoft.com/en-us/library/9tdesxec%28v=vs.80%29.aspx)