其实要实现我的目的,只要用Sleep(1000)这条语句就可以了,这里之所以要限定用WaitForSingleObject函数,是因为我想弄明白如何用互斥量使WaitForSingleObject进入“无信号”的等待状态。我的代码如下:
HANDLE hMutex = CreateMutex(0,0,0);
DWORD dwWaitResult = WaitForSingleObject(hMutex, 1000L);
上面代码只要让返回值dwWaitResult为WAIT_TIMEOUT就可以实现延时的目的了,可它总是返回WAIT_OBJECT_0,请问要如何改才能实现我的目的呢?注意:是在单线程下。请大家指点一下!
HANDLE hMutex = CreateMutex(0,0,0);
DWORD dwWaitResult = WaitForSingleObject(hMutex, 1000L);
上面代码只要让返回值dwWaitResult为WAIT_TIMEOUT就可以实现延时的目的了,可它总是返回WAIT_OBJECT_0,请问要如何改才能实现我的目的呢?注意:是在单线程下。请大家指点一下!
解决方案 »
- [求助]DirectX编写程序Debug版正常,改成Release版 有N多错误
- 当 模态对话框 DoModal之后 怎么检测消息呢?
- 控件怎么用啊
- 怎么样获取硬盘信息?
- 动态创建的工具按钮数组,希望在窗体缩小时显示Chevrons,也就是下拉箭头,菜单里有未能显示的按钮
- 对话框调用视图
- 关于在桌面任意位置停靠窗口、MP3粘着停靠风格的窗口,弹出来的提示窗口实例
- 在ATL的接口函数中,参数不能用(char*)类型?
- VC程序,拖文件到一个图标上开始执行该程序的怪事
- 在Picture控件(CStatic)上再放入其他控件,为何其他ActiveX控件在设计和运行时不能正常显示?
- vc 读取word中的表格
- CreateProcessWithLogonW 这个函数怎么定义呢?
DWORD dwWaitResult = WaitForSingleObject(hEvent , 1000L);
否则就用event
----------------------
HANDLE g_hMutex = NULL;
char g_cArray[11] = {0};UINT ThreadProc1(LPVOID pParam)
{
// 等待互斥对象通知
WaitForSingleObject(g_hMutex, INFINITE);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[i] = 'a';
Sleep(40);
}
// 释放互斥对象
//ReleaseMutex(g_hMutex);
return 0;
}UINT ThreadProc2(LPVOID pParam)
{
WaitForSingleObject(g_hMutex, INFINITE);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[i] = 'b';
Sleep(4); //增加访问冲突的机会
}
// 释放互斥对象
//ReleaseMutex(g_hMutex);
return 0;
}UINT ThreadProc3(LPVOID pParam)
{
WaitForSingleObject(g_hMutex, INFINITE);
AfxMessageBox(g_cArray);
// 释放互斥对象
//ReleaseMutex(g_hMutex);
return 0;
}void CTestDlg::OnOK()
{
memset(g_cArray, 0, 11);
// 创建互斥对象
g_hMutex = CreateMutex(NULL, FALSE, NULL);
// 启动各线程
AfxBeginThread(ThreadProc1, NULL);
AfxBeginThread(ThreadProc2, NULL);
AfxBeginThread(ThreadProc3, NULL);
}
----------------------
上面代码共有3个线程,为了增加访问冲突的可能,线程1慢吞吞地对指定内存进行写入;线程2也同样对该内容进行写操作;线程3则是等他们都进行完了后,显示一下最后的结果的。
我的疑问是:WaitForSingleObject函数难道除了等待互斥量的信号外(互斥量被其他线程锁住时),如果互斥量是自由的话,还能够顺手把它给锁住不成?另外,上面代码中ReleaseMutex这行代码,为什么要不要它都不影响最终结果的正确性?不要这行的话会不会有什么隐患?
1. WaitForSingleObject获取互斥量成功后会锁住互斥量
2. ReleaseMutex这行代码,它不影响最终结果的正确性的原因是线程马上结束了。如果线程结束系统会自动释放其拥有的互斥量的所有权的。不要这行的话,如果线程由于某种原因挂起的话,其他线程再也拿不到互斥量的所有权了。
CreateMutex BOOL bInitialOwner 这参数取值 False 时, 第一个执行的线程将会最先拥有互斥对象, 一旦拥有其他线程就得等待
第2个问题,楼上说的很详细了