QT异步获取数据方法
1.信号槽
这个是最常用的,搭配多线程使用。主线程只需要写好槽函数并connect后,等待信号的来到就行了。
一些信号的参数类型如果是自定义类型需要在主线程构造函数上注册一下。
其中,多线程的方法有:继承QThread,重写run函数;继承QObject,使用moveToThread函数;
工作函数继承QRunnable,使用线程池。
2.QtConcurrent
也是多线程的一种方式,使用QtConcurrent的函数。
run函数在线程中调用自定义的函数,后面可以跟函数的参数(可选)
QFuture < QString > f1=QtConcurrent::run(&hello,123);
其中,hello是任意线程的函数名,可以直接在当前线程中单独开辟一个线程为这个函数服务。后面的是函数参数,前面是返回的函数结果。(QString可以变)。
3.QEventLoop
事件循环,这个应该算是一种伪异步,因为虽然他只能让这段代码的前部分的代码工作,阻塞后面的代码。
举个信号槽的例子。它会把线程阻塞在当前,然后在这个前面的信号槽连接可以使用,当获取信号时立马执行槽函数;但是后面的连接就不能使用,即便获取到了信号也不会立马运行槽函数,而是这个事件循环结束后再运行。
QEventLoop loop;
QTimer::singleShot(5000, &loop, &QEventLoop::quit);
loop.exec();
也可以监听线程结束的信号。
QEventLoop loop;
MyThread thread;
QObject::connect(&thread, &MyThread::threadFinished, &loop, &QEventLoop::quit);
thread.start();
loop.exec();