gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:04:21 25 4
gpt4 key购买 nike

我有一个简单的应用程序,在主视图中我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com