+ -
当前位置:首页 → 问答吧 → 大虾们来看看,怎么解决WaitForSingleObject的问题?

大虾们来看看,怎么解决WaitForSingleObject的问题?

时间:2011-12-01

来源:互联网

if(!m_MSComm.get_PortOpen())
{
AfxMessageBox("请先打开串口!");
return;
}
CString strRead;
HANDLE pHandle = GetCurrentThread();//不知道能不能获得线程??
for(int Index = 0;Index<4;Index++)
{
strRead.Format(_T("%c%c"),13,Index);
SendData(strRead);
DWORD dw = WaitForSingleObject(pHandle, 1000);

if(dw == WAIT_OBJECT_0)
{

page[Index] = strReadTemp;//strReadTemp是串口读取的数据,赋值给page
}
else
{
AfxMessageBox(_T("出错!"));
return;
}
}
主要是通过串口发送数据,然后等待反馈,我想通过WaitForSingleObject来获得串口有没有信号,可是dw总不等于WAIT_OBJECT_0,不知道HANDLE pHandle = GetCurrentThread()有没有获得句柄,获得后可不可以使用WaitForSingleObject(pHandle, 1000),怎么实现这一功能,串口是能收到数据的,怎么样才能设置串口接收到数据然后有一个响应?

作者: zzustd   发布时间: 2011-12-01

你这样只有当这个线程退出后,WaitForSingleObject才会等于WAIT_OBJECT_0

作者: hnzlk   发布时间: 2011-12-01

这个问题你可以创建Semaphore,然后初始值设为0,有数据来的时候再RleaseSemaphore()

作者: hnzlk   发布时间: 2011-12-01

能详细点么?

作者: zzustd   发布时间: 2011-12-01

WaitForSingleObject(handle , time),不是在time时间内有信号就触发循环的吗?

作者: zzustd   发布时间: 2011-12-01

你等待自己线程结束,这只可能超时的

作者: Lactoferrin   发布时间: 2011-12-01

没认真看,你想串口给你反应,那你让串口那边回应就是啦.你用线程干啥子.

作者: hnzlk   发布时间: 2011-12-01

自己等待自己?

作者: VisualEleven   发布时间: 2011-12-01

串口是会返回数据,只要确定返回数据后我才能发送下一个数据,要在消息处理添一个设置有信号是吗?我是新手,不要喷我,谢谢。

作者: zzustd   发布时间: 2011-12-01

我是想让线程通知下我的函数做下一个动作,又不至于无限等待串口,假如超时我做另外处理这样。

作者: zzustd   发布时间: 2011-12-01

GetCurrentThread返回的是伪句柄,不能用于WaitForSingleObject
将伪句柄转为真正的句柄,用DuplicateHandle
BOOL DuplicateHandle(
  HANDLE hSourceProcessHandle,
  HANDLE hSourceHandle,
  HANDLE hTargetProcessHandle,
  LPHANDLE lpTargetHandle,
  DWORD dwDesiredAccess,
  BOOL bInheritHandle,
  DWORD dwOptions
);

作者: sky101010ws   发布时间: 2011-12-01

你把DWORD dw = WaitForSingleObject(pHandle, 1000);去掉

作者: Lactoferrin   发布时间: 2011-12-01

引用 2 楼 hnzlk 的回复:
这个问题你可以创建Semaphore,然后初始值设为0,有数据来的时候再RleaseSemaphore()

DWORD dw = WaitForSingleObject(Semaphore, INFINITE);


有数据来的时候RleaseSemaphore(),然后dw就会==wait_object_0

作者: hnzlk   发布时间: 2011-12-01

CSemaphore * pSemaphore = NULL; (语法错误 : 缺少“;”(在“*”的前面))创建Semaphore需要包含哪些头文件?

作者: zzustd   发布时间: 2011-12-01

#include<windows.h>

CreateSemaphore

作者: Lactoferrin   发布时间: 2011-12-01

我先试试,谢谢大家

作者: zzustd   发布时间: 2011-12-01

怎么系统没有CSemaphore这个类?也没有<afxmt.h>这个头文件。

作者: zzustd   发布时间: 2011-12-01

线程在结束的时候会自动把信号设为有状态,这样用WaitForSingleObject的方法可以返回WAIT_OBJECT_0,前提是在第二个参数设置的时间内线程结束,否则返回WAIT_TIMEOUT。
你可以在你程序里判断是否返回为WAIT_TIMEOUT或者WAIT_FAILED,如果是WAIT_FAILED,用GetLastError判断下错误原因,很容易就可以解决了。
不过在自己线程里等待线程结束,不管这个线程句柄是否是真是假,楼主开始的逻辑就出问题了。

作者: rongrong0538   发布时间: 2011-12-01