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