关于线程函数里使用settimer?

huanying710 2005-10-24 01:03:01
AfxBeginThread((AFX_THREADPROC)SubThread,(void *)pStruct,THREAD_PRIORITY_NORMAL,0, 0,NULL);

UINT CMyDlg::SubThread(void *)
{
SetTimer(1,10000,NULL);
return 0;
}
出现如下错误:
CWnd::SetTimer' : illegal call of non-static member function
假如我在线程函数中使用
CWnd wnd;
wnd.SetTimer(1,10000,NULL);

倒是没有错误了,但是运行后会弹出非法对话框,请教为何?
我创建了一个消息响应函数处理一些操作,settimer就是为了计时间隔重复做CMyDlg::OnTimer()中的操作
...全文
346 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Baku 2005-10-24
  • 打赏
  • 举报
回复
可以把窗口句柄作为参数传进去,然后::SetTimer(hWnd,1,1000,NULL)
huanying710 2005-10-24
  • 打赏
  • 举报
回复
我把this作为线程函数参数传递进去,获得了窗口句柄,现在可以进入OnTimer,完成操作,但是这个期间,程序的其他按钮包括关闭按钮都无法使用。
huanying710 2005-10-24
  • 打赏
  • 举报
回复
::SetTimer(NULL,1,10000,NULL);
huanying710 2005-10-24
  • 打赏
  • 举报
回复
多谢!这个错误已经解决了;
但是还有个问题请教一下:
我在用settimer时(未创建任何其他线程),进行计数后就似乎“死”在那里了,对话框的最小化,关闭按钮以及菜单都没法点,但是计时确实在进行,而且在我设置的时间间隔内完成想要的操作,问题在于这样一来,程序的其他按钮都无法使用?
这个问题是因为我没有创建其他线程,而主线程一直在做计数功能,导致无法其他操作吗?

然后我创建了一个新线程,就出现原贴的问题,改了之后,却没法进入OnTimer函数了,结果如上述情况一样,似乎“死”在那里,而且因为没有进入OnTimer,所以也没有完成需要的操作;

请问一下有碰到这样的情况吗?
qrlvls 2005-10-24
  • 打赏
  • 举报
回复
因为 CMyDlg::SubThread 是 static 函数,不能直接调用非静态的成员函数,只能通过 pDlg->SetTimer 来调用
或者使用 ::SetTimer 来引用 API 指定回调函数进行调用

wnd.SetTimer(1, 10000, NULL);
的问题在于 WM_TIMER 消息是发送到 NULL 句柄的窗口的,此时 wnd 并没有 Create,因此 wnd.m_hWnd == NULL

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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