• 操作系统 一个进程通过内核事件 来控制另一个线程的结束


    操作系统 线程的创建_van9527的博客-CSDN博客

    中线程的基础上

    这里我们要实现进程至进程间的交互

     

    新建一个进程2

    按下进程2的按钮  进程1的线程结束

     进程之间的用户模式的内容都是私有的  但是所有进程之间都共用一个内核模式

    所以我们可以定义内核模式的事件来实现进程之间的交互

    所以在主界面中定义一个变量 

    HANDLE m_hEvent;来创建事件

    在ui的构造中

    m_hEvent=CreateEventA(0,0,0,0);

    这里介绍一下CreateEventA函数

    1. m_hEvent=CreateEventA(NULL,//安全属性
    2. TRUE,//TRUE 人工信号 FALSE 自动信号
    3. FALSE,//初始信号
    4. "MyEvent"//名字
    5. );

    是用来创建事件的

    其中 参数中的 人工信号/自动信号 

    WaitForSingleObject(wig->m_hEvent,100)中 如果是自动信号  完成语句后 信号会被置为原来的  而人工信号则不会  需要手动改变

    然后在线程函数中 我们的判断条件需改变

    1. DWORD WINAPI TheradProc(LPVOID lpParameter)
    2. //线程函数是一个全局函数 不能识别ui 所以线程参数 传参传Widget*类型
    3. {
    4. Widget*wig=(Widget*)lpParameter;
    5. for (int i=0;i<=100/*&&wig->Mark==true*/;i++) {
    6. //如果信号为真 跳出循环 结束线程
    7. if(WAIT_OBJECT_0==WaitForSingleObject(wig->m_hEvent,100))
    8. {
    9. //自动信号 获取到信号后 会把信号置为原来的
    10. break;
    11. }
    12. //发送信号 传i的值用于修改
    13. emit wig->signalSetValue(i);
    14. Sleep(100);
    15. }
    16. return 0;
    17. }

    退出函数中

     //将事件变成有信号
        SetEvent(m_hEvent);

    1. void Widget::on_pushButton_3_clicked()
    2. {
    3. //正常退出
    4. //Mark=false;
    5. //将事件变成有信号
    6. SetEvent(m_hEvent);
    7. //强制杀死
    8. //TerminateThread(hTherad,-1);
    9. //3.能正常退出 则正常退出 如果不能 则强制杀死
    10. //(线程正常退出时会发送一个信号 如果信号=WAIT_TIMEOUT则视为正常退出)
    11. if(hTherad)
    12. {
    13. if(WAIT_TIMEOUT==WaitForSingleObject(hTherad,100))
    14. TerminateThread(hTherad,-1);
    15. CloseHandle(hTherad);
    16. hTherad=NULL;
    17. }
    18. ui->progressBar->setValue(0);
    19. }

    在第二个进程中

    我们添加一个按钮 为按钮添加一个槽函数

    这里用到了OpenEvent函数  打开事件"MyEvent"  获取到了全部权限

    如果获取成功 就把信号置为有信号

    进程1中的线程就会结束

    1. void Widget::on_pushButton_clicked()
    2. {
    3. //控制上一个进程的结束
    4. HANDLE hOpenEvent=OpenEventA(EVENT_ALL_ACCESS,0,"MyEvent");
    5. if(hOpenEvent)
    6. {
    7. SetEvent(hOpenEvent);
    8. }
    9. }

  • 相关阅读:
    MFC Windows 程序设计[337]之历史下拉列表框(附源码)
    【Java实战】Mysql读写分离主从复制搭建保姆级教程
    JAVA基础——day07
    RS-485通信
    K8S部署Dashboard
    vuex五大核心、辅助函数
    权威认可!安全狗获CNVD“漏洞信息报送贡献单位”殊荣
    汽车电子的发展简介和V型开发模式
    创建一个给定形状的数组,并用给定的值填充numpy.full()
    Harbor使用公网证书
  • 原文地址:https://blog.csdn.net/van9527/article/details/126175518