回调函数 不同线程和相关代码 究竟在哪个线程中执行

关于SendMessage的问题我在子线程中需要通过回调函数显示一些数据到主窗体上我是SendMessage投递的自定义消息给主窗体的,这样做试了下都没问题但是现在有个问题是我如果关闭掉窗口,则会发现子线程在SendMessage后会卡死,应该是主线程OnDestroy后窗口句柄m_hWnd为NULL。。因此我做了如下处理,boo g_bQuit =CRITICAL_SECTION g_CritSInitializeCriticalSection(&g_CritSect);和DeleteCriticalSection(&m_CritSect);分别在类构造析构中调用了& //OnDestroy函数void CManageSvrDlg::OnDestroy(){ & &
EnterCriticalSection(&g_CritSect); &
g_bQuit = // 标识窗体被销毁 & &
LeaveCriticalSection(&g_CritSect); &
& }//回调函数如下(子线程中调用)BOOL CManageSvrDlg::OutPutPipe(const char* csLogInfo, LPVOID lpParameter){ &
EnterCriticalSection(&g_CritSect); &
if (g_bQuit) & &
SendMessage(uMsg, wParam,lParam); //////////////////////// &
LeaveCriticalSection(&g_CritSect);}运行结果: &
运行后通过输出log发现,如果OnDestroy先被调用程序就运行正常,但是如果是回调函数先被调用,则还是会卡在SendMessage函数。问题: &
请教下,该如何处理?我把回调函数中的SendMessage改成非阻塞的PostMessage就OK了; &
请教下有没有其它的方法,不是很能理解,我既然OnDestroy中已经加锁了,照理来说如果先执行了回调函数,则窗体不是不应该被销毁掉吗,为啥还是无法SendMessage,还是说我的加锁不应该加在OnDestroy中
EnterCriticalSection(&g_CritSect); if (g_bQuit) SendMessage(uMsg, wParam,lParam); ////////////////////////LeaveCriticalSection(&g_CritSect);这个逻辑是有问题的g_bQuit为真的话,没有释放临界区,会造成死锁SendMessage如果某个参数无效(NULL),应该不会阻塞而是直接返回错误吧
schuller_4s
回答2:错误的使用方式 却不总是错误.
schuller_4sC++线程回调函数调用类成员函数方法,有需要的朋友可以参考下。
线程回调函数使用类成员函数的目的是可以直接访问类属性,保持封装性
利用this指针传递实例的地址,然后调用实例的成员函数,在成员函数中就可以访问类属性
简单示例:
定义一个参数类,其中m_pObj是指向类实例
class ThreadArg {
ThreadArg(RfidTcpServer *pObj, int socket)
:m_pObj(pObj), m_socket(socket)
RfidTcpServer *m_pO
在类中定义static成员函数作为中转
class RfidTcpServer {
RfidTcpServer(IEpcHandler *pHandler);
virtual ~RfidTcpServer();
void IsAccept();
static DWORD WINAPI ParserPacketRoutine(LPVOID pM);
int ParserPacket(int conn);
SOCKET listenS
SOCKET connectS
SOCKADDR_IN servA
SOCKADDR_IN clntA
int serverP
IEpcHandler *m_pH
DWORD WINAPI RfidTcpServer::ParserPacketRoutine(LPVOID pM)
ThreadArg *pArg = (ThreadArg *)pM;
pArg-&m_pObj-&ParserPacket(pArg-&m_socket);
创建线程,将类中的static函数作为线程回调函数
void RfidTcpServer::IsAccept()
int clntAddrLen = sizeof(SOCKADDR_IN);
while(1) {
connectSocket = accept(listenSocket, (sockaddr *)&clntAddr, &clntAddrLen);
if (connectSocket & 0)
ThreadArg *pArg = new ThreadArg(this, connectSocket);
//将this指针和参数打包为ThreadArg,作为线程函数的参数
CreateThread(NULL, 0, ParserPacketRoutine, (LPVOID)pArg, 0, NULL);
最新教程周点击榜
微信扫一扫谁在调用那些回调函数_Windows_ThinkSAAS
谁在调用那些回调函数
谁在调用那些回调函数
内容来源: 网络
在Windows应用程序开发中,有很多地方使用了回调函数。一般的开发并不关心谁来调用这些函数,但如果开发复杂的多线程协作处理程序,或者研究操作系统中程序的“操作权限”问题,您就需要知道您写的这段代码是由谁来调用的,在哪个线程或进程中执行的。
最常见的就是Windows消息响应函数。一般的书本并不讨论这些函数是如何被调用的,只是说消息产生时,这些函数将会执行。初学者也许会以为,如果两个消息一起发出,那么它们的响应函数会同时执行。事实并不是这样。这些函数是串行执行的,也就是说只有执行完一个之后,另一个才有机会被调用。不仅如此,这些函数也不是由什么系统调用的,而是由一个确定的线程中统一管理,这个线程正是你的程序自己的主线程。
您可能自己并没有写这样的代码,但您使用的基础库中有。无论是MFC还是ATL,您都可以在它们的源代码中找到类似下面这样的内容:
while(GetMessage(&msg,
NULL, 0, 0))
TranslateMessage(&msg);
DispatchMessage(&msg);
这个是消息循环,也称消息泵。它像个抽水机似的,把消息从一个地方抽出来,然后洒给各个消息响应函数处理。因此也可以说,消息响应函数是从线程的消息泵开始调用的。
还有一种作为参数传进去的回调函数。这些回调函数类似于Java中的那些接口,当调用某个函数时,把它当成参数传进去。在适当的时候,这些被函数会被调用。很多窗口枚举函数就是这样的,比如:EnumChildWindows、EnumDesktopWindows、EnumWindows等。这些函数其实并不是异步函数,在函数返回时,相应的功能已经完成,被传进去的回调函数也已经被调用过了。这种情况下,回调函数可看作是被相应的功能函数调用的。
钩子(HOOK)处理函数也是一种回调函数。我曾一度以为它是由操作系统的某个线程调用的,但事实并非如此。我在钩子函数里使用GetCurrentThreadId测试了一下,发现调用钩子函数的线程竟然是安装钩子的那个线程。那么这个调用是从哪发起的呢?原来还是消息泵!当调用GetMessage或PeekMessage函数时,并不只是把消息从队列中取出来这么简单,而是做了更复杂的工作。具体这些API是如何实现的我们不得而知,但有一个我进行了验证:不启动消息泵,钩子啥也钩不到。所以归根结底,钩子处理函数还是由线程的消息泵开始调用的。
Windows使用消息和回调函数来调度程序的执行,同一线程设置的回调函数,无论是消息响应还是钩子,最后仍在这一线程内执行,消息泵负责调度。
了解这一点,我们就可以在这些回调函数中放心地使用任何资源了,不用担心互斥、死锁。但是要担心另外一些问题:比如消息响应的嵌套冲突导致的数据变化、消息的循环发送等。一般这些问题都易于重现,所以还算容易发现和处理。
作者:苏林
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信在回调函数中加入:
messagebox.show(system.threading.thread.currentthread.managedthreadid.tostring());
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1869046次
积分:20578
积分:20578
排名:第312名
原创:246篇
转载:749篇
评论:135条
(1)(27)(6)(3)(7)(1)(3)(5)(1)(2)(1)(6)(2)(4)(3)(3)(7)(5)(28)(4)(18)(20)(12)(6)(6)(5)(9)(5)(5)(7)(7)(7)(1)(2)(7)(10)(23)(5)(44)(31)(29)(39)(93)(18)(14)(72)(7)(28)(48)(41)(25)(14)(1)(4)(11)(9)(14)(7)(7)(8)(5)(1)(24)(20)(18)(7)(16)(7)(41)(13)(9)

我要回帖

更多关于 多线程回调函数 的文章

 

随机推荐