前景:
C#中的多线程举例
csharp
private Thread threadDownLoadParameter;
threadDownLoadParameter = new Thread(new ThreadStart(parameterInterface.downParameterLoadData)); //parameterInterface 实例对象,downParameterLoadData 方法
threadDownLoadParameter.Start();
qt中对应的多线程的使用举例
目标类继承QThread 覆写虚函数function run()
cpp
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
class ParameterI : public QObject
{
Q_OBJECT
public slots:
void downParameterLoadData()
{
// 在这里实现 downParameterLoadData 方法的功能
qDebug() << "downParameterLoadData executed on thread" << QThread::currentThreadId();
}
};
class DownloaderThread : public QThread
{
public:
void run() override
{
// 在这里创建 ParameterI 实例,并调用 downParameterLoadData
ParameterI parameterInterface;
parameterInterface.downParameterLoadData();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建 DownloaderThread 实例
DownloaderThread downloaderThread;
// 启动线程
downloaderThread.start();
// 等待线程结束
downloaderThread.wait();
return a.exec();
}
补充: 2023年12月27日
线程类 QThread
cpp
// 和调用 exit() 效果是一样的
// 代用这个函数之后, 再调用 wait() 函数
[slot] void QThread::quit();
// 启动子线程
[slot] void QThread::start(Priority priority = InheritPriority);
// 线程退出, 可能是会马上终止线程, 一般情况下不使用这个函数
[slot] void QThread::terminate();
// 线程中执行的任务完成了, 发出该信号
// 任务函数中的处理逻辑执行完毕了
[signal] void QThread::finished();
// 开始工作之前发出这个信号, 一般不使用
[signal] void QThread::started();
使用方式:
①需要创建一个线程类的子类,让其继承QT中的线程类 QThread
②重写父类的 run() 方法,在该函数内部编写子线程要处理的具体的业务流程
③在主线程中创建子线程对象,new 一个就可以了
④启动子线程, 调用 start() 方法
cpp
class MyThread:public QThread①
{
protected:
void run()
{
........②
}
}
③MyThread * subThread = new MyThread;
④subThread->start();
ps:不能在类的外部调用run() 方法启动子线程,在外部调用start()相当于让run()开始运行【见于connect操作时,接收的对象的不同
特别留意:
当子线程别创建出来之后,父子线程之间的通信可以通过信号槽的方式,注意事项:
在Qt中在子线程中不要操作程序中的窗口类型对象, 不允许, 如果操作了程序就挂了
只有主线程才能操作程序中的窗口对象, 默认的线程就是主线程, 自己创建的就是子线程