问题标签 [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.
python - PyQt:如何在不冻结 GUI 的情况下更新进度?
问题:
- 在不锁定 GUI(“无响应”)的情况下跟踪线程进度的最佳做法是什么?
- 一般来说,线程在 GUI 开发中的最佳实践是什么?
问题背景:
- 我有一个适用于 Windows 的 PyQt GUI。
- 它用于处理 HTML 文档集。
- 处理一组文档需要三秒到三个小时不等。
- 我希望能够同时处理多个集合。
- 我不希望 GUI 锁定。
- 我正在寻找线程模块来实现这一点。
- 我对线程比较陌生。
- GUI 有一个进度条。
- 我希望它显示所选线程的进度。
- 如果已完成,则显示所选线程的结果。
- 我正在使用 Python 2.5。
我的想法:让线程在更新进度时发出 QtSignal 触发一些更新进度条的功能。完成处理时也会发出信号,以便显示结果。
对此方法的任何评论(例如缺点、陷阱、赞美等)都将受到赞赏。
解析度:
我最终使用 QThread 类和相关的信号和插槽在线程之间进行通信。这主要是因为我的程序已经将 Qt/PyQt4 用于 GUI 对象/小部件。该解决方案还需要对我现有的代码进行较少的更改来实现。
这是一篇适用的 Qt 文章的链接,该文章解释了 Qt 如何处理线程和信号,http://www.linuxjournal.com/article/9602。摘录如下:
幸运的是,Qt 允许跨线程连接信号和槽——只要线程运行它们自己的事件循环。与发送和接收事件相比,这是一种更简洁的通信方法,因为它避免了所有重要的应用程序中都需要的所有簿记和中间 QEvent 派生类。线程之间的通信现在变成了将信号从一个线程连接到另一个线程的槽的问题,线程之间交换数据的互斥和线程安全问题由 Qt 处理。
为什么有必要在要连接信号的每个线程中运行一个事件循环?原因与 Qt 在将信号从一个线程连接到另一个线程的插槽时使用的线程间通信机制有关。当建立这样的连接时,它被称为排队连接。当信号通过排队连接发出时,下一次执行目标对象的事件循环时调用插槽。如果槽被另一个线程的信号直接调用,则该槽将在与调用线程相同的上下文中执行。通常,这不是您想要的(尤其是如果您使用数据库连接,则不是您想要的,因为数据库连接只能由创建它的线程使用)。排队的连接将信号正确地分派给线程对象,并通过搭载事件系统在其自己的上下文中调用其槽。这正是我们想要的线程间通信,其中一些线程正在处理数据库连接。Qt 信号/槽机制在根本上是上述线程间事件传递方案的实现,但具有更清洁和更易于使用的接口。
注意: eliben也有一个很好的答案,如果我不使用处理线程安全和互斥的 PyQt4,他的解决方案将是我的选择。
c++ - 在 QThread 的上下文中调用方法
在我的应用程序中有一个主线程和一个工作线程(QThread
)。
我想从主线程调用我的工作线程的方法并让它在线程的上下文中运行。
我试过使用QMetaObject::invokeMethod
并给它QueuedConnection
选项,但它不起作用。
我也尝试过从主线程(连接到工作线程的插槽)发出信号,但这也失败了。
这是我尝试过的大致内容的片段:
使用 QMetaObject 方式:
使用信号方式:
两种方式都会导致主线程 id 打印在QThread
doWork
.
另外,我想实现一个简单的生产者-消费者,但如果可行,有什么理由不这样做吗?
c++ - 如何终止 QThread?
QThread::terminate()
文档指出不鼓励通过调用此函数来终止线程。
在我的程序中,我需要在线程完成执行之前终止它。该线程正在执行一些繁重的计算,我希望用户能够控制停止计算。
我该怎么做而不是打电话QThread::terminate()
?
c++ - QThread::wait() 和 QThread::finished()
QThread::wait() 在调用与 QThread::finished() 信号相关联的所有槽后是否返回(即取消阻止执行)?
提前致谢。
c++ - 在 Qt 的子线程中调用函数?
我有一个在不同时间调用子线程函数的主线程,但我不确定在 Qt 中这是否是正确的方法。下面的代码有什么问题并寻找更好的替代方案
当主线程释放锁子时,主线程会无限运行。
multithreading - QThread中的QTcpSocket
我有简单的服务器连接线程。当您调用函数 receiveString 时,它会失败。但是,当您在 run() 中执行相同的代码时,它会成功。函数 receiveString 需要什么才能工作?
我都试过了
实际代码:
qt - 如何终止 QThread
最近,我在这个标题中提到了这个问题。我尝试过使用 QThread::terminate(),但我无法停止线程,它处于死循环中(比如说,while(1))。
多谢。
user-interface - Qt 跨线程发信号,一个是 GUI 线程?
在 Qt 中使用 moveToThread 将对象从一个线程移动到另一个线程是什么意思?甚至在使用 moveToThread 之前,一切似乎都正常工作,它将对象从一个线程(GUI 线程)移动到另一个线程(工作)并且 Qt:connect 调用对象上的适当插槽。
由于对象所在的位置、GUI 线程或工作线程有什么区别吗?
编辑:我做了一个小程序,但我不明白 QThread 如何与 Signal 和 slot 函数一起工作,如果你能用示例解释 moveToThread 的用途,我将不胜感激
qt - 从其他线程发出信号
我有一个类,它有一个由主线程和其他 3 个线程调用的方法(2 个 QThreads 和 1 个使用 QtConcurrent::run())。在这种方法中,我有时会发出一个信号。这是可以的还是会导致问题,因为我没有发出属于调用线程的信号。
qt - 使用 qtconcurrent 生成异常并调用 QTime:currentTime
我似乎只使用使用 Qtconcurrent::run 创建的线程生成异常
我有一个名为 FPSengine 的类,它有一个名为 FPSengine::getData() 的方法,该方法由主线程和 3 个其他线程(2 个 QThreads 和 1 个使用 QtConcurrent::run())调用。在 FPSengine::getData() 内部,我调用 QTime::currentTime()。如果我从主线程或 QThreads 之一调用 FPSengine::getData() 我没有任何问题,但是当我从使用 Qtconcurrent::run() 创建的线程调用 FPSengine::getData() 时,有时会出现异常。Qtconcurrent 或 QTime:currentTime() 甚至 tzset (由 gdb 堆栈显示的 QTime::currentTime 调用)是否有问题?还是我的代码有问题。这是失败线程的堆栈信息:
0 raise /lib/libc.so.6 0
1 abort /lib/libc.so.6 0
2 ?? /lib/libc.so.6 0
3?? /lib/libc.so.6 0
4 免费 /lib/libc.so.6 0
5 ?? /lib/libc.so.6 0
6 tzset /lib/libc.so.6 0
7 QTime::currentTime() /usr/lib/libQtCore.so.4 0
8 FPSengine::xmitData FPSengine2.cpp 93
9 FPSengine: :getData FPSengine2.cpp 21
10 线程数据日志::运行线程数据日志.cpp 109
11 ?? /usr/lib/libQtCore.so.4 0
12 start_thread /lib/libpthread.so.0 0
13 克隆 /lib/libc.so.6 0 14 ?? 0