问题标签 [qthread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2508 浏览

multithreading - Qt - 工作线程冻结 UI

这是我第一次使用 Qt 进行线程处理,所以请多多包涵。

我有一个单例“系统”对象,它定期执行一段繁重的代码。我从我的 UI 控制系统单例,但系统不知道 UI。

我在我的主线程中创建了一个线程,然后将系统移动到它:

UI 挂起,直到系统的定期处理周期完成。

我还尝试将 QThread 子类化并从run方法调用exec 。

可能是什么问题呢?我肯定做错了什么。

最好的祝福

0 投票
2 回答
4649 浏览

python - GUI 使用 PyQt 和 Qthreads 非常缓慢

我在使用 PyQt 和 Qthreads 保持 GUI 响应时遇到问题。我所做的是从 GUI 中生成一个工作线程 Qthread,它的 CPU 很重。worker Qthread 在每个周期发送一个包含数值的信号。在 GUI 中,信号连接到更新函数,该函数获取数值并重新绘制 GUI。我使用标准的 Qt SIGNAL/SLOT 机制。

这一切似乎与我在网上找到的有关 PyQt、GUI 和 Qthreads 的文档一致。问题是工作线程如此频繁地触发信号,以至于 GUI 变得非常缓慢。一个解决方案是让工作线程不那么频繁地触发信号,但我想快速更新进度。

这一切看起来都很标准,但我找不到合适的解决方案。可能我需要更改设计?

任何帮助,将不胜感激。

代码:

0 投票
2 回答
6347 浏览

c++ - 唤醒一个处于睡眠状态的 QThread?

如何在 QThread 处于睡眠状态时唤醒它?

我有一个在后台运行的线程,然后不时醒来并做一些小事情,但是如果我想以受控方式停止该线程,我必须等待他自己醒来才能让他退出。而且由于他睡了很长时间,这可能很烦人。

这是一个显示基本问题的小示例代码。

让我们从这个例子中休眠 5 秒然后只打印一个点的线程开始。

然后我们有 main 启动线程然后杀死他。

问题是 tt->wait(); 必须等待线程休眠的 5 秒。我可以叫一个像“从睡眠中醒来”这样的东西,这样他就可以继续了。

还是有更好的方法来做到这一点?

/谢谢


更新我让它与 QMutex 和 tryLock 一起工作:

但是使用 QWaitCondition 会更好吗?还是一样?


更新:如果启动和停止他的胎面不同,QMutex 就会中断,所以这里尝试使用 QWaitCondition。

0 投票
1 回答
1094 浏览

qt - QPluginLoader 移至线程

我正在构建一个严重依赖插件的应用程序:核心从串行接口获取数据并将其传递给每个插件,以便每个人都可以决定如何处理它。

我的设计允许插件构建一个通过 QMdiSubWindow 附加到 MDIArea 的 Widget。这一直有效,直到我需要互斥锁,因为一切都在同一个线程中运行,所以我很快就陷入了死锁。所以我认为将每个插件移动到不同的线程可以解决这个问题。问题是(目前),不再创建 QMdiSubWindow,我不知道为什么会发生这种情况。

核心通过使用信号和插槽与插件进行通信。

这就是我加载插件并将它们移动到线程中的方式:

请注意,这是对原始代码的简化。我根据这篇文章http://www.christeck.de/wp/2010/10/23/the-great-qthread-mess/遵循了这种方法(将我的插件移动到一个线程)

registerSubWindow() 是我的插件中创建小部件的方法:

它发出一个信号,该信号被核心用这个槽捕获,它将生成的小部件注册为提到的 MdiSubWindow:

0 投票
7 回答
166567 浏览

python - PyQt中带有QThread的后台线程

我有一个程序,它通过我在 PyQt 中编写的 gui 与我正在使用的收音机接口。显然无线电的主要功能之一是传输数据,但要连续执行此操作,我必须循环写入,这会导致 gui 挂起。由于我从未处理过线程,因此我尝试使用无线电需要在传输之间休眠来摆脱这些挂起QCoreApplication.processEvents().,但是,gui 仍然根据这些休眠持续的时间而挂起。

有没有使用 QThread 解决此问题的简单方法?我一直在寻找有关如何使用 PyQt 实现多线程的教程,但其中大多数都涉及设置服务器,并且比我需要的要先进得多。老实说,我什至不需要我的线程在运行时更新任何东西,我只需要启动它,让它在后台传输,然后停止它。

0 投票
2 回答
451 浏览

qt - Qt - 工作线程上的神秘段错误

我在工作线程上实例化 QSystemDeviceInfo,但它会导致段错误。

类是线程安全的,还是问题出在其他地方?

编辑:通过进一步调试,我还注意到本机 Symbian 也会调用 segfault。

此致

0 投票
2 回答
248 浏览

c++ - 如何保护 QThread 函数,使其在完成之前的工作之前不会再次被调用?

我正在使用 QThread 并且在它的run方法中我有一个计时器调用一个函数,该函数执行一些需要一些时间的繁重操作。通常超过触发计时器的时间间隔(但并非总是如此)。

我需要的是保护这个方法,这样只有在它完成了之前的工作后才能调用它。

这是代码:

0 投票
1 回答
411 浏览

c++ - Windows XP 上单核 CPU 的 Qt 线程问题

我正在使用 Qt 开发一个跨平台的分形浏览器。我在 Windows XP(使用 MSVC Express 2010 编译的程序)下在单核 CPU 上运行时遇到了性能问题,我还没有尝试过其他版本的 Windows。有两个内核,程序运行良好。它在具有一核或两核(使用 GCC 编译)的 Linux 下也能正常运行。

性能问题与通过计算线程中的信号调用小部件中的插槽有关。该小部件包含一个 QImage,我将一个指向其像素的指针传递给计算线程。该线程计算分形并将像素绘制到图像上。在每一行的末尾,线程向小部件发出一个信号,告诉它更新主线程中的显示。据我了解,这是一个排队连接。

使用 Windows 和单个 CPU,更新非常慢,比计算慢得多。它使程序无法使用。

相关代码类似于 Qt 文档中的 Mandelbrot 示例,除了我的信号没有参数,因为 Qimage 位于小部件而不是线程中,并且我没有将 QImage 转换为 QPixmap。

有没有人知道问题可能是什么以及如何解决它?它与调度,时间切片分配有关吗?MSVC 中是否有我需要设置的编译器标志?或者我需要如何修改我的程序?

非常感谢!

0 投票
1 回答
1521 浏览

qt4 - 如何使用 qt 线程访问小部件?

在我的程序中,我有一个带有文本框和 qthread 指针的小部件类。使用 qthread 指针我想通过文本选择不断更新文本框而不影响应用程序。但我无法访问文本框。尽管我通过将参数传递给 qthread 来访问文本框。我可以访问文本框并更新文本选择几次然后我的应用程序自动终止并指示错误

list_thread: ../../src/XlibInt.c:596: _XPrivSyncFunction: Assertion `(dpy->flags & (1L << 3)) != 0' 失败。

0 投票
2 回答
4083 浏览

qt - QThread 不会停止/不处理信号

我正在尝试在一个单独的线程中执行一些工作,并在工作完成后停止该线程。

我已经建立了这样的连接

但是当我发出 finished() 信号时,永远不会调用 quit() 插槽。命令行不显示与失败连接相关的任何警告。

我创建了一个简单的测试项目来缩小问题范围,并且得到了相同的行为:

测试类.h:

测试类.cpp:

和 main.cpp:

所以这就是我期望发生的事情:

  1. 一旦testThread.start()被处理,线程的run()函数就会被调用,该函数在内部调用exec()并启动一个事件循环。此外,它会发出一个started()信号。
  2. testClass有它的doWork()插槽被调用。
  3. 完成TestClass::doWork()后,它会发出一个finished()信号。
  4. 的事件循环testThread接收信号并将其转发到其quit()插槽
  5. testThread.wait()线程结束时从等待中返回。

步骤 1-3 工作,我得到了qDebug()输出。问题出在第 4 步:信号被触发并转发到某个事件循环(我对其进行了一点调试,但无法弄清楚它被触发到了哪个事件循环),但quit()从未调用过该插槽。

我究竟做错了什么?

PS:请不要建议子类化QThread,我尝试这种方式的全部目的是因为我想避免子类化QThread。