有时候在gui编程中需要调用一个非常耗费时间的api类的函数,这个时候不使用多线程的话界面就会卡死。使用多线程有一个非常简单的办法,不需要建立新的QThread派生类。
设需要调用的api定义为
bool demoDialog::threadDemo(QString realArgStr1, QString realArgStr2,int realArgInt)
{
////
...
////
}
如果不是qt的api函数,自己建立一个简单的包装函数就行了。要保证传递的参数都是qt变量,这里不能传递指针
那么在对话框的某个函数中这样调用threadDemo
QFuture<bool> result = QtConcurrent::run(this,(&demoDialog::threadDemo),realArgStr1,realArgStr2,realArgInt);
while(result.isResultReadyAt(0)!= true)
{
QCoreApplication::processEvents();
}
if(result.result())
{
//success
}
else
{
//failed
}
就可以实现界面不卡死而在新的线程中运行threadDemo(),threadDemo()返回后新线程自动退出。
这个办法的缺点是,api运行期间cpu占用非常的高,是processEvents导致的。