DLL开启线程

渐渐的不归路 2014-08-22 09:42:03
用MFC写了一个串口收发的DLL,又自己写了一个测试demo,测试DEMO点击开启串口的时候,到了DLL里面,开启串口的函数里我写了一个线程,如果串口开启我就发送条指令,等待返回之后进行比较,主进程等待,等到收到数据后唤醒,如果相等,函数返回1,现在的问题是我单步调试程序没问题,如果直接debug运行,测试demo就未响应,我跟踪到
if (pThread->m_pfnThreadProc != NULL)
{
nResult = (*pThread->m_pfnThreadProc)(pThread->m_pThreadParams); //这里就卡住,但是单步执行就可以过去
ASSERT_VALID(pThread);
}

求指教 !!!谢谢
...全文
170 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
渐渐的不归路 2014-08-22
  • 打赏
  • 举报
回复
引用 8 楼 Idle_ 的回复:
看看逻辑: 主线程调用dll中函数,然后函数在等待另一个线程返回,因此主线程阻塞。 另一个线程通过m_Port发送数据然后等待event, 另一个线程阻塞。 m_Port发生完成生成消息放入主线程消息队列等待主线程PeekMessage/GetMessage去处理,然后处理函数中才SetEvent(). 你没注意主线程已经阻塞没机会去处理消息吗? 很标准的死锁。 改变死锁很容易,最简单就是不用线程。如果一定要用线程去发送的话,dll中不要用WaitForSingleObject(event,...)等待,而是换成循环MsgWaitForMultipleObjects(event,...)去等待,同时返回不是WAIT_OBJECT_0时调用PeekMessage/TranslateMessage/DispatchMessage处理消息
谢谢了!应该是这个问题,我研究研究
阿呆_ 2014-08-22
  • 打赏
  • 举报
回复
看看逻辑: 主线程调用dll中函数,然后函数在等待另一个线程返回,因此主线程阻塞。 另一个线程通过m_Port发送数据然后等待event, 另一个线程阻塞。 m_Port发生完成生成消息放入主线程消息队列等待主线程PeekMessage/GetMessage去处理,然后处理函数中才SetEvent(). 你没注意主线程已经阻塞没机会去处理消息吗? 很标准的死锁。 改变死锁很容易,最简单就是不用线程。如果一定要用线程去发送的话,dll中不要用WaitForSingleObject(event,...)等待,而是换成循环MsgWaitForMultipleObjects(event,...)去等待,同时返回不是WAIT_OBJECT_0时调用PeekMessage/TranslateMessage/DispatchMessage处理消息
渐渐的不归路 2014-08-22
  • 打赏
  • 举报
回复
引用 6 楼 SiGoYi 的回复:
[quote=引用 4 楼 x348722662 的回复:] [quote=引用 3 楼 SiGoYi 的回复:] 从代码上看可能是WaitForSingleObject(eventFlag.m_hObject,INFINITE);执行前,eventFlag.SetEvent();已经被调用完了。所以出现死等了,楼主可以打两个log来验收证我说的是否正确,打log看这两句哪个先被执行了。
我单步调试时候先到WaitForSingleObject(eventFlag.m_hObject,INFINITE) 之后才到eventFlag.SetEvent(); 程序正常运行 现在的问题是我直接DEBUG运行,我的测试demo就卡住 测试demo的button
	typedef int(_stdcall *Sms_Connection)(LPCTSTR Sms_Con,int Com_Port,int Com_BaudRate);
	Sms_Connection Proc;
	Proc = (Sms_Connection)GetProcAddress(hinstDLL,"Sms_Connection");
	int iValue = Proc(tmp,3,9600);
    if (iValue == 1)
	{
        AfxMessageBox("success!");
	} else if (iValue == 0) {
        AfxMessageBox("fail!");
	}
[/quote] 从你的代码能看出卡住的位置就应该是“WaitForSingleObject(eventFlag.m_hObject,INFINITE);”造成的。你调用这句的时候是在主线程吧!在主线程的话肯定要把你ui卡死啊。 而且多线程的代码你不能用debug来说事,你调式是会改变程序原来运行的顺序的。其实就是你两个线程没有同步好,导致在主线程中“WaitForSingleObject(eventFlag.m_hObject,INFINITE);”等死了,没有收到另一个线程set的event[/quote] 那我应该这么做比较好呢?谢谢啊
SiGoYi 2014-08-22
  • 打赏
  • 举报
回复
引用 4 楼 x348722662 的回复:
[quote=引用 3 楼 SiGoYi 的回复:] 从代码上看可能是WaitForSingleObject(eventFlag.m_hObject,INFINITE);执行前,eventFlag.SetEvent();已经被调用完了。所以出现死等了,楼主可以打两个log来验收证我说的是否正确,打log看这两句哪个先被执行了。
我单步调试时候先到WaitForSingleObject(eventFlag.m_hObject,INFINITE) 之后才到eventFlag.SetEvent(); 程序正常运行 现在的问题是我直接DEBUG运行,我的测试demo就卡住 测试demo的button
	typedef int(_stdcall *Sms_Connection)(LPCTSTR Sms_Con,int Com_Port,int Com_BaudRate);
	Sms_Connection Proc;
	Proc = (Sms_Connection)GetProcAddress(hinstDLL,"Sms_Connection");
	int iValue = Proc(tmp,3,9600);
    if (iValue == 1)
	{
        AfxMessageBox("success!");
	} else if (iValue == 0) {
        AfxMessageBox("fail!");
	}
[/quote] 从你的代码能看出卡住的位置就应该是“WaitForSingleObject(eventFlag.m_hObject,INFINITE);”造成的。你调用这句的时候是在主线程吧!在主线程的话肯定要把你ui卡死啊。 而且多线程的代码你不能用debug来说事,你调式是会改变程序原来运行的顺序的。其实就是你两个线程没有同步好,导致在主线程中“WaitForSingleObject(eventFlag.m_hObject,INFINITE);”等死了,没有收到另一个线程set的event
渐渐的不归路 2014-08-22
  • 打赏
  • 举报
回复
如果换成WaitForSingleObject(eventFlag.m_hObject,2000),第一次执行fail,之后每次执行都success
渐渐的不归路 2014-08-22
  • 打赏
  • 举报
回复
引用 3 楼 SiGoYi 的回复:
从代码上看可能是WaitForSingleObject(eventFlag.m_hObject,INFINITE);执行前,eventFlag.SetEvent();已经被调用完了。所以出现死等了,楼主可以打两个log来验收证我说的是否正确,打log看这两句哪个先被执行了。
我单步调试时候先到WaitForSingleObject(eventFlag.m_hObject,INFINITE) 之后才到eventFlag.SetEvent(); 程序正常运行 现在的问题是我直接DEBUG运行,我的测试demo就卡住 测试demo的button
	typedef int(_stdcall *Sms_Connection)(LPCTSTR Sms_Con,int Com_Port,int Com_BaudRate);
	Sms_Connection Proc;
	Proc = (Sms_Connection)GetProcAddress(hinstDLL,"Sms_Connection");
	int iValue = Proc(tmp,3,9600);
    if (iValue == 1)
	{
        AfxMessageBox("success!");
	} else if (iValue == 0) {
        AfxMessageBox("fail!");
	}
SiGoYi 2014-08-22
  • 打赏
  • 举报
回复
从代码上看可能是WaitForSingleObject(eventFlag.m_hObject,INFINITE);执行前,eventFlag.SetEvent();已经被调用完了。所以出现死等了,楼主可以打两个log来验收证我说的是否正确,打log看这两句哪个先被执行了。
渐渐的不归路 2014-08-22
  • 打赏
  • 举报
回复
pWnd = AfxGetApp()->GetMainWnd(); if (m_Port.InitPort(pWnd, 3, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512)) { if (m_Port.StartMonitoring()) { FlagPort = 1; pRecv = AfxBeginThread(ConnectPort,(LPVOID)pWnd,THREAD_PRIORITY_NORMAL,0,NULL); // pRecv->ResumeThread(); Sleep(1500); WaitForSingleObject(eventFlag.m_hObject,INFINITE); } } if (ConStr == StrIMEI) { int i = 0; StrIMEI = ""; return 1; } else return 0; 线程: } UINT ConnectPort(LPVOID pParam) { CWnd *pWnd = (CWnd*)pParam; if (FlagPort == 1) { m_Port.WriteToPort("AT+CGSN\r\n"); return 1; } else return 0; } 接收SerialPort里的接收 CString str,strResult; str.Format("%c",RXBuff); tempStr +=str; if (tempStr.Find("ABC") >=0 ) { if (tempStr.Find("OK") >= 0) { start = tempStr.Find("ABC"); end = tempStr.ReverseFind('\n'); // TRACE("%d,,,,%d",start,end); tempStr = tempStr.Mid(start+8,end-start-11); // TRACE(tempStr); StrIMEI = tempStr; tempStr = ""; eventFlag.SetEvent(); } }
_船长_ 2014-08-22
  • 打赏
  • 举报
回复
贴代码吧,不然别人也无法知道

15,471

社区成员

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

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