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

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

中线程的基础上

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

 

新建一个进程2

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

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

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

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

HANDLE m_hEvent;来创建事件

在ui的构造中

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

这里介绍一下CreateEventA函数

m_hEvent=CreateEventA(NULL,//安全属性
                          TRUE,//TRUE 人工信号 FALSE 自动信号
                          FALSE,//初始信号
                          "MyEvent"//名字

                          );

是用来创建事件的

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

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

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

DWORD WINAPI TheradProc(LPVOID lpParameter)
//线程函数是一个全局函数  不能识别ui  所以线程参数 传参传Widget*类型
{
   Widget*wig=(Widget*)lpParameter;


        for (int  i=0;i<=100/*&&wig->Mark==true*/;i++) {

            //如果信号为真  跳出循环 结束线程
            if(WAIT_OBJECT_0==WaitForSingleObject(wig->m_hEvent,100))

            {
                //自动信号  获取到信号后 会把信号置为原来的
                break;
            }
            //发送信号  传i的值用于修改
            emit wig->signalSetValue(i);
            Sleep(100);
        }


   return 0;
}

退出函数中

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

void Widget::on_pushButton_3_clicked()
{

    //正常退出
    //Mark=false;

    //将事件变成有信号
    SetEvent(m_hEvent);
    //强制杀死
    //TerminateThread(hTherad,-1);
    //3.能正常退出  则正常退出 如果不能  则强制杀死
    //(线程正常退出时会发送一个信号  如果信号=WAIT_TIMEOUT则视为正常退出)
    if(hTherad)
    {
        if(WAIT_TIMEOUT==WaitForSingleObject(hTherad,100))
                TerminateThread(hTherad,-1);

        CloseHandle(hTherad);
        hTherad=NULL;
    }
    ui->progressBar->setValue(0);

}

在第二个进程中

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

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

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

进程1中的线程就会结束

void Widget::on_pushButton_clicked()
{
      //控制上一个进程的结束
    HANDLE hOpenEvent=OpenEventA(EVENT_ALL_ACCESS,0,"MyEvent");
    if(hOpenEvent)
   {
       SetEvent(hOpenEvent);
   }

}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值