VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 508|回复: 9

请教一个低级问题,关于线程函数里使用无返回值的WaitForSingleObject的含义

[复制链接]
87_avatar_middle
最佳答案
11 
在线会员 发表于 2019-4-4 10:39:08 | 显示全部楼层 |阅读模式
3驿站币
在许多的线程函数里,使用事件来进行同步.使用WaitForSingleObject来等待事件.根据返回值来判断事件是否触发.这个都能理解,但在线程函数里也有无返回值的WaitForSingleObject.这就不理解了,请老大解惑,谢谢!

如下形式的代码:

DWORD ThreadFun(LPVOID Param)
{

   WaitForSingleObject(handle,INFINFITE);

  return 0;
}





上一篇:Qt及Qt Quick开发实战精解项目二 items方法报错
下一篇:学习驱动第一天的问题 蓝屏!谁来救救这个学生
81_avatar_middle
最佳答案
3 
online_supermod 发表于 2019-4-4 10:52:22 | 显示全部楼层
这种情况因为 WaitForSingleObject 的第二个参数传递的是 INFINFITE,所以就没有超时时间了,说白了就是死等,你不返回我就一直等着。所以可以这么举例子给你解释下:第一个参数有可能是个线程句柄或者是个进程句柄,我当前线程就是要等待目标的线程或者进程结束,你不结束我就不返回,只要返回一般情况下就说明目标线程或者进程结束了,所以这种情况也就不判断返回值了
87_avatar_middle
最佳答案
11 
ico_lz  楼主| 发表于 2019-4-4 11:00:03 | 显示全部楼层
是不是可以这样理解,利用无返回值的WaitForSingleObject的函数直接终止线程函数的运行
81_avatar_middle
最佳答案
3 
online_supermod 发表于 2019-4-4 16:24:47 | 显示全部楼层
cqzj70 发表于 2019-4-4 11:00
是不是可以这样理解,利用无返回值的WaitForSingleObject的函数直接终止线程函数的运行

利用无返回值的WaitForSingleObject的函数直接终止线程函数的运行?
什么意思,没懂你的意思!估计你也没理解我的意思
87_avatar_middle
最佳答案
11 
ico_lz  楼主| 发表于 2019-4-4 16:36:18 | 显示全部楼层
本帖最后由 cqzj70 于 2019-4-4 16:40 编辑
Debug 发表于 2019-4-4 16:24
利用无返回值的WaitForSingleObject的函数直接终止线程函数的运行?
什么意思,没懂你的意思!估计你也 ...


我确实也没懂你的意思,但我自己生成了一个工程,现在有点理解了

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
HANDLE handle = NULL;
DWORD ThreadFunc(LPVOID Param)
{
        int i = 0;
        while (true)
        {
                WaitForSingleObject(handle,INFINITE);//无信号则终止线程
                i++;
                printf("%d\r\n",i);
                Sleep(300);
                SetEvent(handle);//重置为有信号,否则会终止线程函数
        }

        return 0;
}

int main()
{
        DWORD  threadId;
        handle = CreateEvent(NULL,FALSE,TRUE,NULL);//无继承,手动重置信号,有信号,无名事件
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, 0, 0, &threadId);
        system("pause");
    return 0;
}

在以上的代码中,去掉 循环里的 SetEvent(handle); 这句线程函数只会执行一次,但加入这句就会无限的循环
75_avatar_middle
最佳答案
0 
在线会员 发表于 2019-4-4 16:39:24 | 显示全部楼层
你去看看他的 handle是啥 不就知道意义了吗
75_avatar_middle
最佳答案
0 
在线会员 发表于 2019-4-5 09:50:26 | 显示全部楼层
理解有点问题。
1)WaitForSingleObject(handle,INFINITE);的作用是阻塞当前线程。它返回值,要么成功,要么失败。这里并不关心。
因为失败,它后续所用工作都搞不成,它只能成功。事实上它就只有一个选择:成功。否则它就会被辞退走人。
2)它不是终止线程,而是悬停线程。就是人们经常说的,你等一会,喊你做再做。别瞎几把忙。
3)要让终止,要么SetEvent发信号,要么CloseHandle断它的根。因为在线程里,主程序结束,它还会赖在那里。
下面给出例程,演示其控制

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <process.h>
#include <Windows.h>
using namespace std;
BOOL boQuit = FALSE;
DWORD WINAPI ThreadFuncOne(LPVOID Param);
void CallThread(HANDLE hEvent);
int main()
{
        HANDLE hEvent;
        hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        ResetEvent(hEvent);//这句可以忽略,因为初始为无信号
        unsigned int uThreadId;
        _beginthreadex(NULL, 0, (_beginthreadex_proc_type)ThreadFuncOne, hEvent, 0, &uThreadId);
        cout << "按F8呼叫线程" << endl;
        cout << "按ESC退出" << endl;
        DWORD lastTick = GetTickCount();
        while (1) {
                if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) break;
                if (GetAsyncKeyState(VK_F8) & 0x8000) {
                        DWORD thisTick = GetTickCount();
                        if (thisTick - lastTick > 1000) {
                                lastTick = thisTick;
                                cout << "长城,长城,请回答?" << endl;
                                Beep(750, 300);
                                CallThread(hEvent);
                        }
                }
        }
        boQuit = TRUE;
        SetEvent(hEvent);
        CloseHandle(hEvent);
    return 0;
}
void CallThread(HANDLE hEvent) {
        SetEvent(hEvent);
}
DWORD WINAPI ThreadFuncOne(LPVOID Param) {
        HANDLE hEvent =(HANDLE)Param;
        while (!boQuit) {
                WaitForSingleObject(hEvent, INFINITE);
                cout << "长城收到1 ok!" << endl;
                Beep(523, 200);
                Beep(587, 200);
                Beep(659, 200);
                Beep(523, 200);
                Beep(523, 200);
                Beep(587, 200);
                Beep(659, 200);
                Beep(523, 200);
                Beep(659, 200);
                Beep(698, 200);
                Beep(784, 550);
                Beep(659, 300);
                Beep(698, 300);
                Beep(784, 550);
                Beep(784, 100);
                Beep(880, 100);
                Beep(784, 100);
                Beep(698, 100);
                Beep(659, 200);
                Beep(523, 200);
                Beep(784, 100);
                Beep(880, 100);
                Beep(784, 100);
                Beep(698, 100);
                Beep(659, 200);
                Beep(523, 200);
                Beep(659, 300);
                Beep(391, 300);
                Beep(523, 300);
                Beep(659, 300);
                Beep(391, 300);
                Beep(523, 300);
                ResetEvent(hEvent);
                SleepEx(1,TRUE);
        }
        return 0;
}

请教一个低级问题,关于线程函数里使用无返回值的WaitForSingleObject的含义

点评

WaitForSingleObject(handle,INFINITE);的作用是阻塞当前线程。这句话道出了无显式返回值函数的用法  发表于 2019-4-5 15:36

评分

参与人数 2驿站币 +3 热心值 +3 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!
87_avatar_small cqzj70 + 1 + 1 很给力!

查看全部评分

87_avatar_middle
最佳答案
11 
ico_lz  楼主| 发表于 2019-4-5 15:25:12 | 显示全部楼层
本帖最后由 cqzj70 于 2019-4-5 15:32 编辑

楼上这位仁兄,表述的可以完全理解了。
在开始我有可能没表达清楚,我意思是这个函数在常规用法是有显式的返回值,我们可以根据这个显示的返回值进行处理,但现在就是要理解没有显式返回值的用法
58_avatar_middle
最佳答案
43 
online_vip 发表于 2019-4-5 17:05:03 | 显示全部楼层
xx_player 发表于 2019-4-5 09:50
理解有点问题。
1)WaitForSingleObject(handle,INFINITE);的作用是阻塞当前线程。它返回值,要么成功,要 ...

@SummerGull
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-23 18:57

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表