c++ - Qt 如何从运行的线程更新主窗口,正确的方法

标签 c++ multithreading qt

我有一个简单的应用程序,在主视图中我有 QListview 。我的流程是这样的我需要知道它是否正确
1.应用程序启动和启动单线程,也看到线程对象和主应用程序之间的信号/槽连接
2.线程以xml格式从远程服务器获取数据并将数据设置到对象容器(表示数据的类)
3.当对象中的数据准备就绪时,它会触发 SIGNAL 返回主应用程序(第 1 节中的信号/插槽)
4.SIGNAL调用更新函数,通过其模型(QAbstractListModel)将格式化数据设置到QListView中

问题是当第 4 阶段发生时,我看到应用程序出现 2-3 秒的抖动,这让我想知道这里出了什么问题。

更新:
使用 sleepy 分析应用程序后 看起来应用程序中的延迟我不确定,但显示在“独家”列中 非常高的数字 322.35s。 在调用 run 方法内的 http 请求的线程中,我有这段代码导致线程暂停。

void RequestThread::run()
{
          m_RequestThreadTimer = new QTimer();
          connect(m_RequestThreadTimer, SIGNAL(timeout()),
                  this,SLOT(fire(),Qt::DirectConnection));
          QVariant val(GetValFromConfig());       
          int interval = val.toInt();
          m_RequestThreadTimer->setInterval(interval);
          m_RequestThreadTimer->start();    
          QThread::exec();
}

但现在的问题是如何改进它?

最佳答案

我怀疑,由于您在 QThread::run() 方法中创建了计时器,因此在主线程的上下文中调用了计时器连接到的插槽。

您无需子类化 QThread 即可在其自己的线程中运行代码。

只需创建一个 QObject 的子类,添加您想要的功能,创建一个 QThread 实例,启动它并使用 QObject::moveToThread() 方法将 QObject 的线程亲和性设置为新线程。

    worker = new WorkerClass;
    connect(worker,SIGNAL(response(QString)),this,SLOT(response(QString)));
    QThread *t = new QThread;
    t->start();
    worker->moveToThread(t);

    //Start it either like this or by emitting a signal connected to the startWorking slot
    QMetaObject::invokeMethod(worker,"startWorking",Qt::QueuedConnection);

关于c++ - Qt 如何从运行的线程更新主窗口,正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8664626/

相关文章:

c++ - send() 函数中的错误代码 88(Socket 编程)

C++ 协作

Java线程栈内存占用

c++ - QT 类型被外部库定义为 int?

c++ - 警告 : Unreferenced local variable

c++ - 重载new和delete,new[]和delete[]有什么关系?

android 持续轮询...如何?

c++ - 表单上的按钮样式

c++ - 如何在 mac os x 上使用 g++ 编译一个简单的 Qt 和 c++ 应用程序?

c++ - 最快/最好的方法来对数据库中的数据进行序列化和反序列化