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