子线程里如何使用定时器啊? 没有窗口的 是工作线程

nuaa3 2005-07-16 09:10:24
最好给个代码
...全文
223 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nuaa3 2005-07-16
  • 打赏
  • 举报
回复
试了第一个 可以 谢谢
AntonlioX 2005-07-16
  • 打赏
  • 举报
回复


这是MFC的CWinThread类的实现。 首先创建一个线程 _beginthread(MainThread, DEFAULT_STACK_SIZE, NULL);
然后在MainThread中创建一个看不见的窗口(伪窗口):
WNDCLASS wcl;
HWND hWnd = NULL;

memset(&wcl,0,sizeof(wcl));

if (lpfnWndProc == NULL)
{
return NULL; /*失败*/
}

/*register class*/

wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground = NULL;
wcl.hCursor = NULL;
wcl.hIcon = NULL;
wcl.hInstance = NULL;
wcl.lpfnWndProc = MainWindowProc;
wcl.lpszClassName = szWndName;
wcl.lpszMenuName = NULL;
wcl.style = CS_VREDRAW;
if (RegisterClass(&wcl) == 0)
{
return NULL;
}

/*create window*/
hWnd = CreateWindow(szWndName,NULL,WS_POPUP,0,0,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,NULL,NULL);

/*进入消息循环*/
do
{
ret = GetMessage(&msg,NULL,0,0);
if (ret > 0)
{
DispatchMessage(&msg);
}

}while(ret > 0);


DestroySTUNServerWindow(szWndName, s_hSTUNServerWnd);
最后可以在MainWindowProc中处理你的消息了:
LRESULT CALLBACK MainWindowProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

return 0;
}
AntonlioX 2005-07-16
  • 打赏
  • 举报
回复
你把PostThreadMessage(dwThreadId,WM_USER+1,0,0);注释掉就可以收到定时器消息了,或者是你在线程里循环的接收消息,否则只能接收到一条。
AntonlioX 2005-07-16
  • 打赏
  • 举报
回复
UINT_PTR hTimer = 0;
//定时器消息处理函数
VOID __stdcall TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
KillTimer(NULL,hTimer);
MessageBox(NULL,"Speak in Timer!",":)",MB_OK);
}

//线程函数
DWORD __stdcall ThreadFun(void *)
{
MSG msg;
PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE);
hTimer = SetTimer(NULL,0,10,(TIMERPROC)TimerProc);
while(!PeekMessage(&msg,NULL,WM_TIMER,WM_USER+1,PM_NOREMOVE))
{
OutputDebugString("Not peek message\r\n");
Sleep(100);
}
if(msg.message == (WM_USER+1))
{
//收到主线程发来的消息
OutputDebugString("Rec message\r\n");
}
else
{
//收到定时器消息,派送之
OutputDebugString("what message\r\n");
DispatchMessage(&msg);
}
return 0;
}


//创建线程代码:
DWORD dwThreadId;
HANDLE hThread = NULL;
hThread = CreateThread(NULL,0,ThreadFun,NULL,0,&dwThreadId);
if (hThread == NULL)
{
MessageBox("CreateThread failed.", "main", MB_OK );
}
else
{
OutputDebugString("prepare post message\r\n");
Sleep(1000);//等待线程创建好了
PostThreadMessage(dwThreadId,WM_USER+1,0,0);//给线程发消息
OutputDebugString("Post message ok\r\n");
CloseHandle( hThread );
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧