以下是一个使用Qt多线程的示例代码,如果任务在500ms内没有返回值,将会返回默认值。
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
// 自定义任务类
class MyTask : public QObject
{
Q_OBJECT
public:
explicit MyTask(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doTask()
{
// 模拟耗时任务
QThread::msleep(1000);
// 如果任务在500ms内没有返回结果,则发送默认值
if (!m_resultReady)
{
emit resultReady("Default Value");
}
}
signals:
void resultReady(const QString &result);
public:
bool m_resultReady = false;
};
// 主线程类
class MainThread : public QObject
{
Q_OBJECT
public:
explicit MainThread(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void startTask()
{
qDebug() << "Main Thread: Starting task";
// 创建子线程并启动任务
QThread* thread = new QThread;
MyTask* task = new MyTask;
task->moveToThread(thread);
connect(thread, &QThread::started, task, &MyTask::doTask);
// 在500ms后检查是否有结果返回,若无则发出默认值
QTimer::singleShot(500, this, [=]() {
if (!task->m_resultReady)
{
qDebug() << "Main Thread: Task timeout. Returning default value";
emit task->resultReady("Default Value");
thread->quit();
}
});
connect(task, &MyTask::resultReady, this, [&](const QString &result) {
qDebug() << "Main Thread: Task result:" << result;
thread->quit();
});
connect(thread, &QThread::finished, task, &MyTask::deleteLater);
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
thread->start();
}
signals:
void taskResult(const QString& result);
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MainThread mainThread;
QObject::connect(&mainThread, &MainThread::taskResult,
[&](const QString& result){
qDebug() << "Main Thread: Task result received in main thread:" << result;
// 在这里处理任务结果
});
// 启动任务
mainThread.startTask();
return a.exec();
}
#include "main.moc"
这是一个简单的例子,主线程中创建了一个子线程,并在子线程中执行耗时任务。通过QTimer
定时器,在500ms后检查任务是否已经返回结果,若没有,则发送默认值。主线程可以通过信号槽连接来接收任务的结果。
请注意,这段代码仅为示例,实际使用时需要根据具体需求进行适当修改和完善。
内容由零声教学AI助手提供,问题来源于学员提问