Qt 进程事件
Qt process events
我有一个导出到 qml 的QString
对象。在C++
代码中,在更新值并发出属性的更改信号时,它不会更新它,因为线程繁忙:在这段时间里,我在 for 循环中使用成本操作。为此,我使用 QCoreApplication::processEvents()
能够在循环的每次迭代中发出延迟信号,例如:
foreach(const QVariant& item, _manifestFile) {
setStatusString(QString("Checking file %1 of %2...").arg(currentProcessingFile++).arg(totalFilesCount));
QCoreApplication::processEvents(); // TODO remove
//...
}
其中setStatusString
是我上面描述的QString
变量的setter:
void Updater::setStatusString(const QString &statusString) {
_statusString = statusString;
emit statusStringChanged();
}
如何删除该processEvents()
并能够发出信号?任何解决方案都值得赞赏:线程,Qt-meta对象事物等。
您应该在堆上创建类Updater
的对象,并将其移动到新线程,以防止 for 循环阻塞主线程和 UI。这可以像这样完成:
updater = new Updater();
QThread * th = new QThread();
updater->moveToThread(th);
QObject::connect(th,SIGNAL(started()),updater,SLOT(OnStarted()));
QObject::connect(th,SIGNAL(finished()),updater,SLOT(OnFinished()));
QObject::connect(updater,SIGNAL(statusStringChanged(QString)),this,SLOT(updateString(QString)));
th->start();
类Updater
中的初始化和终止任务应分别在OnStarted()
和OnFinished()
槽中完成。
现在,您可以使用适当的值发出信号,该值将在适当的时间内排队和处理。您可以在定时器中以一定的间隔定期发出信号,以防止发出太频繁。
最后一点是,当Updater
函数位于其他线程中时,不应直接调用它。正确的方法是将函数定义为插槽,并将信号连接到该插槽,并在要调用特定函数时发出信号。
相关文章:
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- WMI检测进程创建事件-c++
- Windows 进程间同步类似事件?
- 如何等待密钥事件,直到进程在 QT 中完成
- 创建进程使用路径时出现错误事件:类型 "char *" 的 E0167 参数与类型 "LPWSTR" 的参数不兼容
- 有没有办法接收有关在窗口中启动的进程的事件
- WinEventHook未捕获特定进程id中的事件
- 如何检测终止进程事件、计算机关闭和计算机崩溃
- 服务和用户模式进程之间的共享全局事件不起作用
- Windows 运行时 (WP 8) 进程外组件和引发/订阅事件
- Reg Free进程外COM服务器事件
- 监视进程内的键盘事件(进程范围)
- Win32 将同步事件发送到其他进程
- 使用Windows中另一个进程的事件循环向Qt应用程序发送退出消息
- Qt 进程事件
- 具有进程的句柄 如何注册以监视其关闭/重新启动/复制事件
- 是否可以在Qt3.0中发出跨进程信号或发布触摸/鼠标点击事件
- 事件回调守护进程
- 如何将事件处理程序附加到本机 Node.js 模块中的进程出口?