首先在WinApp中进行创建线程实例,然后进行线程的CreateThread()---这样就实现了线程的启动。
那么如果我想用对线程实现循环发送消息怎么办呢:
1、首先是在WinApp中无法拦截WM_TIMER消息进行定时触发器的实现循环
2、在WinApp中进行无限循环的时候就是出现无法退出的情况这样窗口的创建就会失败
那么解决方案是:
使用全局的SetTimer进行设置,但是需要hWnd,又是一个问题hWnd是NULL,那么全局SetTimer函数就会返回一个新的计时器,然后执行SetTimer指定的回调函数(值得注意的是回调函数必须是静态的,而且声明为CallBack类型)。
BOOL CTWinApp::InitInstance()
{
//需要考虑到指针的生命周期
m_pMainWnd = new CMainWindow();
dynamic_cast(m_pMainWnd)->MainWindowInit();//检查指针的类型
if( !m_pMainWnd )
{
_tprintf(_T("new CFrameWndfalse\r\n"));
return FALSE;
}
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
//线程创建
m_pThread.CreateThread();//主线程
TIMERPROC lpTimerFunc =CWndProbeThread::TimerCallback;
DWORD nID = ::SetTimer(NULL, 0, 3000,lpTimerFunc);
return TRUE;
}
还要注意的是我们给什么线程发送消息就在什么线程里面进行SetTimer指定的回调函数的声明和定义
还要注意的是在发送消息的时候需要指定线程ID,所以要设置函数进行线程ID的保存进行静态的存放
class CWndProbeThread: public CWinThread
{
public:
CWndProbeThread(void);
~CWndProbeThread(void);
static UINT threadProc(LPVOIDpParam);//线程触发函数执行体
static void CALLBACKTimerCallback( HWND, UINT, UINT_PTR, DWORD);//在非CWnd类中进行设置定时器的时候,不能拦截系统的WM_TIMER消息了,但是可以自己设置全局的定时器的回调函数进行相关处理
static DWORDGetCurrentThreadId();//关键的问题就是在定时器的回调函数中无法获取当前线程的ID,那么我可以在线程的类中,设置静态的线程ID变量来存放当前线程的ID
BOOLCreateThread();//在CreateThread中重新进行判断线程的创建的开始
private:
void workProc();
static DWORDm_CurrentThreadId;//静态的存放当前线程的ID
};
VOID CWndProbeThread::TimerCallback( HWND hwnd, UINT uMsg, UINT_PTRidEvent, DWORD dwTime )
{
::KillTimer( hwnd, idEvent );
static UINT_PTR evtThread = WM_USER + 100;
::PostThreadMessage(CWndProbeThread::GetCurrentThreadId(), evtThread++, 0, 0);
TIMERPROC lpTimerFunc = TimerCallback;
DWORD nID = ::SetTimer(NULL, 0, 3000,lpTimerFunc);
}