Qt QObject::startTimer:无法从另一个线程错误启动计时器

Qt QObject::startTimer:无法从另一个线程错误启动计时器,qt,qml,qthread,Qt,Qml,Qthread,我正在获取QObject::startTimer:无法从该代码段的另一个线程启动计时器,它正在阻止我的应用程序并冻结UI。我对QT中的线程技术有点陌生 void ReportModel::myslot(){ moveToThread(&thread); connect(&thread, SIGNAL(started()), this, SLOT(exportProg())); thread.start(); } 在e

我正在获取QObject::startTimer:无法从该代码段的另一个线程启动计时器,它正在阻止我的应用程序并冻结UI。我对QT中的线程技术有点陌生

   void ReportModel::myslot(){
        moveToThread(&thread);
        connect(&thread, SIGNAL(started()), this, SLOT(exportProg()));
        thread.start();
    }
在exportProg中,我正在pendrive中创建一个csv文件。

鉴于ReportModel可能是GUI线程中使用的一个类,这将不起作用,是一个坏主意。此->移动到线程。。。通常是一种不好的代码味道,除非您确切知道自己在做什么


为什么要将模型移动到插槽中的线程?它不应该从一开始就在一个线程中吗?为什么要将插槽连接到启动信号?作业提交到当前对象线程的事件循环的习惯用法可以是QTimer::singleShot0。。。或者QMetaObject::invoke,并且在不依赖于此时开始的线程的情况下工作。很可能,exportProg应该是一个线程安全方法,可以通过QtConcurrent::run提交异步执行。

您的exportProg插槽是否包含任何与先前定义的qtimer交互的代码?我必须在线程内移动该模型,因为我正在笔驱动器中写入CSV文件,这需要几秒钟,但执行此操作时如果发生这种情况,则会冻结UI并使其失去响应。exportProg必须是一个异步方法,才能通过QtConcurrent::run执行。如果在其他线程上运行,则无论您如何运行它,它都必须是线程安全的方法。moveToThread不是什么神奇的线程修复程序。它不会使线程不安全的方法变成线程安全的。