单线程下,如何用WaitForSingleObject函数让程序暂停一段时间?附简要代码,大家请进!

Tian_Dao_Akane 2009-07-29 11:00:23
其实要实现我的目的,只要用Sleep(1000)这条语句就可以了,这里之所以要限定用WaitForSingleObject函数,是因为我想弄明白如何用互斥量使WaitForSingleObject进入“无信号”的等待状态。我的代码如下:
HANDLE hMutex = CreateMutex(0,0,0);
DWORD dwWaitResult = WaitForSingleObject(hMutex, 1000L);
上面代码只要让返回值dwWaitResult为WAIT_TIMEOUT就可以实现延时的目的了,可它总是返回WAIT_OBJECT_0,请问要如何改才能实现我的目的呢?注意:是在单线程下。请大家指点一下!
...全文
317 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingrain213 2010-06-09
  • 打赏
  • 举报
回复
me too 明白了
Tian_Dao_Akane 2009-07-30
  • 打赏
  • 举报
回复
谢谢大家,总算明白了!结贴。
sanguomi 2009-07-30
  • 打赏
  • 举报
回复
WaitForSingleObject 理解成排队等候(等候也可以理解为排队申请).
CreateMutex BOOL bInitialOwner 这参数取值 False 时, 第一个执行的线程将会最先拥有互斥对象, 一旦拥有其他线程就得等待
第2个问题,楼上说的很详细了
wangk 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tian_dao_akane 的回复:]
我的疑问是:WaitForSingleObject函数难道除了等待互斥量的信号外(互斥量被其他线程锁住时),如果互斥量是自由的话,还能够顺手把它给锁住不成?另外,上面代码中ReleaseMutex这行代码,为什么要不要它都不影响最终结果的正确性?不要这行的话会不会有什么隐患?
[/Quote]

1. WaitForSingleObject获取互斥量成功后会锁住互斥量
2. ReleaseMutex这行代码,它不影响最终结果的正确性的原因是线程马上结束了。如果线程结束系统会自动释放其拥有的互斥量的所有权的。不要这行的话,如果线程由于某种原因挂起的话,其他线程再也拿不到互斥量的所有权了。
Tian_Dao_Akane 2009-07-30
  • 打赏
  • 举报
回复
看了诸位的指点后,我研究了半天,仍有些困惑,就写了如下测试代码:
----------------------
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这行代码,为什么要不要它都不影响最终结果的正确性?不要这行的话会不会有什么隐患?
dronly 2009-07-29
  • 打赏
  • 举报
回复
楼主你的Mutex才刚创建就给线程去锁肯定能过的,因为这个时候Mutex是自由的。

你可以让主线程去创建Mutex,然后主线程先马上获得这个锁,WaitForSingleObject(hMutex, 1000L);

主线程不放锁的情况下

然后再让工作线程去WaitForSingleObject(hMutex, 1000L); 就停住了。
greatws 2009-07-29
  • 打赏
  • 举报
回复
单线程用mutex不行,除非在另一个进程里Create拥有,然后在这个进程里openmutex
否则就用event
huziwu 2009-07-29
  • 打赏
  • 举报
回复 1
HANDLE hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD dwWaitResult = WaitForSingleObject(hEvent , 1000L);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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