Qt进程的创建及注意事项

以下介绍QProcess类在使用过程中的方法以及注意事项:
QProcess的作用是在当前进程中创建一个新的进程,来调用外部程序处理完成一些任务而不影响本进程的继续执行,起用法如下:
1. 运用QProcess类创建新进程:
QProcess proc = new QProcess();


2. 链接进程退出时返回状态的槽函数:
QObject::connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), reciever, SLOT(onFinished(int, QProcess::ExitStatus)));
注意:QProcess::ExitStatus为非基本数据类型,链接信号槽是有可能不起作用,因此需要用QProcess::ExitStatus注册一个元对象类型,如下:
qRegisterMetaType<QProcess::ExitStatus>("QProcess::ExitStatus");这样Qt收到finished信号时才能正确转到相应的槽函数。


3. 启动新进程(另外一个可执行文件)
proc->start(execPath);
※execPath为可执行文件的路径,如果路径中带有空格,可用 "\"" + execPath + "\"" 进行处理,即让传入的路径本身为字符串。
※用 proc->start("\"" + execPath + "\""); 进行启动
注意:如果启动的进程需要传递参数,proc->start();的第二个参数是一个QStringList,可以传入参数,但是此时传入的参数不需要前后加空格,
例如:启动的可执行程序为ls,需要传递的参数为-la /usr/,即实现ls -al /usr/ 的效果,则传入参数时(QStringList args),
可以用 args << "-al" << "/usr/"; 如果写成 args << " -al " << " /usr/ ";(即参数前后加空格了),则可能会导致进程启动失败。


4. 等待新进程彻底启动成功:
proc->waitForStarted(int msecs = 30000);
注意:该函数的调用会阻塞当前的界面,直到进程完全启动。如果在指定的msecs内没有启动成功,则解除阻塞,返回false。


proc->waitForFinished(int msecs = 30000);
注意:该函数的调用会阻塞当前的界面,直到启动的进程结束,发送finished(int, QProcess::ExitStatus)信号以后,界面才可以动。
所以一般情况下,如果是在界面线程启动一个新的进程,不会调用该函数,当进程结束后,发送了finished信号,然后做相应处理就行了。


在非GUI线程中,为了保证调用的进程能够启动或超时处理,会调用以上两个函数,确保进程能够正常启动或结束,如果在指定的msecs
内没有启动成功或进程结束,则解除阻塞,返回false。


5. 进程结束后,用槽函数对返回结果进行接收与处理:

void onFinished(int code, QProcess::ExitStatus status) {}


扫码关注公众号【三个程序员】接收实时消息。


发布了58 篇原创文章 · 获赞 83 · 访问量 23万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章