中线程的基础上
这里我们要实现进程至进程间的交互
新建一个进程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);
- }
-
- }
-
-
-
-