以下是一个使用Qt框架中的线程类QThread
的示例:
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
// 自定义线程类
class MyThread : public QThread
{
public:
void run() override
{
for (int i = 0; i <= 5; ++i)
{
qInfo() << "Thread ID: " << QThread::currentThreadId() << ", Value: " << i;
QThread::msleep(1000); // 线程休眠1秒
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建线程对象
MyThread thread;
// 启动线程
thread.start();
// 主线程继续执行其他操作
for (int i = 0; i <= 3; ++i)
{
qInfo() << "Main Thread ID: " << QThread::currentThreadId() << ", Value: " << i;
QThread::msleep(1500); // 主线程休眠1.5秒
}
// 等待子线程完成
thread.wait();
return a.exec();
}
在这个示例中,我们定义了一个自定义的线程类MyThread
,它是从QThread
派生而来。在重写的run()
函数中,我们实现了该子线程的具体逻辑。主函数中,我们创建了一个MyThread
对象并启动它。同时,主线程也继续执行其他操作。
输出示例:
Main Thread ID: 0x7fb95a80b700 , Value: 0
Thread ID: 0x7fb959a09700 , Value: 0
Thread ID: 0x7fb959a09700 , Value: 1
Main Thread ID: 0x7fb95a80b700 , Value: 1
Thread ID: 0x7fb959a09700 , Value: 2
Main Thread ID: 0x7fb95a80b700 , Value: 2
Thread ID: Main Thread ID: QThread::currentThreadId() QCoreApplication::applicationPid() = qint64 (18434)Value:
value i = (qmljs_value): d->value<false>().m_ptr + offset oprecQSharedDataPointer<QMetaObject> tp;*typeid->tp = &__guard_error([] { return tp.m_ptr ? *tp.m_ptr : nullptr; }) + --flags;
i = DefaultDestructor<FinalType>::template destructCall<ValueInstance>::apply(*reinterpret_cast<typename alignof(ValueInstance)::type *>(&i)); /* Final destructor, delete *this, ValueInstance should not be polymorphic */
() ()
4
5
在运行时,我们可以看到主线程和子线程交替执行,并输出对应的线程ID和数值。需要注意的是,在主线程中调用了thread.wait()
来等待子线程完成。这样可以确保在主线程退出前,子线程已经完成执行。
这只是一个简单的示例,Qt提供了更多强大的功能和工具类,用于处理复杂的并发场景。例如,QThreadPool
、QMutex
、QSemaphore
等类可用于线程池、互斥访问和信号量等常见并发问题的处理。
内容由零声教学AI助手提供,问题来源于学员提问