Timer без окна.
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Timer без окна. Expand / Collapse
Автор
Сообщение
21.05.2007 13:04
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 06.07.2008 10:37
Сообщ.: 236, Visits: 1 734
У функции UINT_PTR SetTimer(      
    HWND hWnd,
    UINT_PTR nIDEvent,
    UINT uElapse,
    TIMERPROC lpTimerFunc
);
первым параметром передается HWND окна, в котором обрабатывается сообщение ON_WM_TIMER.
А если на момент создания таймера окна нет, то как и где нужно обрабатывать сообщения таймера?

Делаю так:



class CMainApp : public CWinApp
{
public:
CMainApp( );
~CMainApp( );
virtual BOOL InitInstance( );
BOOL StartTmr( );
BOOL KillTmr( );
protected:
DECLARE_MESSAGE_MAP( );
UINT_PTR m_nTimer;
};

BEGIN_MESSAGE_MAP( CMainApp, CWinApp )
END_MESSAGE_MAP( );

CMainApp::CMainApp( )
{StartTmr( );};

BOOL CMainApp::StartTmr( ){ m_nTimer = SetTimer( NULL, 1, 250, 0 ); return TRUE; };

BOOL CMainApp::KillTmr( ){ KillTimer( NULL, m_nTimer ); return TRUE; };

BOOL CMainApp::InitInstance( )
{
CMainWnd dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
return TRUE;
};

CMainApp::~CMainApp( ){};

CMainApp theApp;

Visual Studio 2005. Проект MFC.
Спасибо.

Сообщ. #913470
21.05.2007 13:27
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Функция SetTimer работает через оконные сообщения поэтому не имея окна (и цикла обработки сообщений) воспользоваться ей не удастся. Выход в использовании мультимедиа таймеров или функции CreateWaitableTimer/SetWaitableTimer.
Сообщ. #913471
23.05.2007 20:41


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 30.09.2008 17:18
Сообщ.: 121, Visits: 2 334
Ну не имея окна все же можно извратиться с помощью SetTimer, а вот не обрабатывая очередь сообщений с ним уже действительно не получится.

#include <stdio.h>
#include <conio.h>
#include <windows.h>

UINT TId;

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
  putc('>',stdout);
  if(kbhit())
  {
    KillTimer(NULL,TId);
    PostQuitMessage(0);
  }
}

int main()
{
  TId = SetTimer(NULL,1,100,(TIMERPROC)TimerProc);
  MSG msg;
  while(GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
  return msg.wParam;
}

Сообщ. #913610
25.05.2007 12:40
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 06.07.2008 10:37
Сообщ.: 236, Visits: 1 734
Все ясно, большое спасибо!!
Сообщ. #913636
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 11:59