问题标签 [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 投票
2 回答
3904 浏览

c++ - 如何使我的 QThread 阻塞并等待从主线程调用的函数返回值?

我正在 QThread 重新实现中做一些工作。时不时地,我想问用户一个是/否的问题,所以我打算使用 QMessageBox::question()。问题是,我不能从线程中调用它。这不是一个大问题,我可以发出一个连接到主 GUI 线程中的插槽的信号,该插槽将显示消息框,但我还需要自定义线程阻塞并等待消息框被关闭并检索返回值(这里是 QMessageBox::StandardButton)。我该如何去做呢?

编辑: 以下(伪)代码会起作用吗?

0 投票
1 回答
2087 浏览

qt - 为什么不调用此类的析构函数?

我有两个类——一个在主线程中运行并执行 GUI 操作,另一个执行一些计算并发出网络请求。

这是在主线程中运行的类的初始化方法的片段:

在主线程中运行的类的析构函数中:

我期望发生的是线程终止并销毁CServerThread类的实例。但是,CServerThread该类的析构函数没有被调用。

0 投票
2 回答
3628 浏览

c++ - Qt QThread使用从worker到gui的信号/插槽出现问题

我有一个使用 Qt Creator 和随附的 GUI 工具开发的 Qt 应用程序。我有一个主线程TheGui和一个由主线程创建的工作线程WorkerThread(称为thread)。

我遇到的问题是当我通过使用在 GUI 中创建一个插槽时

在 GUIvoid sendList(string str);的头文件和工作线程的头文件中的信号中,插槽永远不会被调用。我使用连接两者

在 GUI cpp 文件的构造函数中。我做了类似的事情,除了工作线程中的插槽和来自 GUI 的信号,它工作正常。我通过使用调试器知道信号 sendList 确实被调用了,它只是永远不会进入它。

有什么想法吗?

0 投票
1 回答
3803 浏览

pyqt - 循环 QProgressBar 给出错误 >> QObject::installEventFilter: 无法过滤不同线程中对象的事件

这个问题似乎已经以许多不同的形式被问过很多次,但我还没有找到一个与我的代码解决方案相关的问题。

当我运行程序时它显示

QObject::installEventFilter:无法过滤不同线程中对象的事件。

尽管如此,代码最初可以工作,但一段时间后它会爆炸,python 会给出一个错误,说它停止工作。

我的代码如下:

0 投票
1 回答
1089 浏览

qthread - 如何使用 QThreads 在多个 QTcpSockets 上写入?

我已经为 QTcpSockets 和 QThreads 上的这个问题苦苦挣扎了几天。

我有一个 QTcpServer,它侦听一个端口并使用 nextPendingConnection() 创建一个新客户端。所以现在客户端有一个 qtcpsocket,我可以用它来读写。

假设我有 100 个客户端连接到我的服务器。当其中一个想要向所有人广播消息时,我的主线程(我在其中使用 nextPendingConnection() 创建客户端)将不得不迭代 100 多个客户端并在其套接字上调用 write 方法。例如,如果 10 个用户同时广播,我将不得不进行 1000 次迭代,所以我认为客户端会有一些延迟(当用户收到消息时)。

我想在单独的线程中编写所有套接字,以便我可以并行发送数据。我知道我不能从创建它的线程调用另一个线程的套接字,我不想每个客户端使用一个线程,因为我不知道拥有很多线程是否是个好主意(此外,除非客户端断开连接,否则这些线程应始终运行)。

我已经阅读了线程财富服务器示例,但它没有回答我的问题,因为它们在发送数据后破坏了套接字;我不想破坏我的套接字,因为我必须在它上面监听传入的消息(这样我就可以广播它们)。

我想到的一件事是为每个客户端(在服务器和客户端)有 2 个套接字;这样我就可以保留一个套接字供阅读,而另一个我可以像在线程财富服务器示例中一样使用;在这种情况下,我还将使用线程池来限制任务的数量(否则这将与每个客户端使用一个线程相同)。

您能否指出我正确的方向或给我一些关于如何在每个客户端实际上没有一个线程的情况下实现并行套接字写入的提示......?

最好的祝福,

塞巴斯蒂安

0 投票
0 回答
368 浏览

multithreading - GUI 不会在 QT 的线程化 opengl 应用程序中更新

我使用 QThread 有一个(我认为是)奇怪的行为。我正在使用 3.x 内核在 GNU/Linux 中进行测试

当我使用渲染线程来实现应该在 QGLWidget 中绘制的 opengl 操作时,如果我在我的 Phenom II X4 中运行它,它工作正常。但是,如果我在 Intel(R) Atom(TM) CPU N550 1.50GHz 中运行,则 GUI 仅在触发事件时才会刷新,(如果我移动鼠标或按下键盘)我尝试使用信号/事件跨越线程通知主线程更新自己,但它不起作用。我已经在渲染线程中调用了 QGLWidget 的更新方法,但它也不起作用。

我可以用这个例子重现它 http://mih.voxindeserto.de/threadedcube.html 如果我添加这个调用

在 ExampleRenderThread 的渲染线程的 run 方法中。

这些机器具有相同的操作系统,Archlinux x86_64 和 3.0.7 内核

我不知道是硬件相关还是某些 QThread 设置或事件过滤。可能会发生什么?

0 投票
1 回答
1158 浏览

multithreading - QT:从其他线程运行独立线程

让我举个例子。

我希望 A::b1 和 A::b2 作为完全独立的线程运行,而不是共享父线程 (A) 的资源。有没有办法将主线程指定为 b1 和 b2 的父线程?

我还查看了 QThreadPool 和 QRunnable,但我不明白,如何管理线程池的所有可运行对象(例如,停止其中一个,然后再次运行)。

0 投票
1 回答
1275 浏览

multithreading - 如何通过工作线程更改进度

我是 PyQt4 的新手,所以也许这是一个小事。我尝试在我的 GUI 中显示进度,该进度将由工作线程更新。QProgressBar 与 QTableWidget 中的其他内存一起。

工作线程在我的 GUI 的 init 函数中启动。

这是线程类

如果我的服务器更改数据库中的值,他将调用以下方法,该方法将通过线程中的远程 prozedure 调用捕获。

该模式是一个简单的观察者,它更新了我的 GUI。要更新我的 gui 中的表,请调用以下方法。

如果需要更新,此方法会检查是否有连续更改,以下方法将执行此操作。

可以更新其他内存但不能更新进度,这里是我要更新进度的行

在此行之后,GUI 崩溃,我收到以下消息

QPixmap:在 GUI 线程之外使用像素图是不安全的

我的猜想是我无法在“Main/Gui”线程之外​​更改 QPixmaps。我不知道如何解决这个问题,所以我欢迎所有解决问题的建议。

提前致谢。

0 投票
1 回答
1195 浏览

python - 如何在不冻结主 UI 的情况下更新 QStandartItemModel

我开始学习 PyQt4 并且已经坚持了很长时间并且自己无法弄清楚:

这是概念:有一个带有自定义 QStandartItemModel 的 TreeView,它每隔几秒钟就会重建一次,并且可以有很多(至少数百个)条目,还会有不同列的额外代表等。它相当复杂,而且即使是没有委托的普通模型的构建时间也会上升到 0.3 秒,这会使 TreeView 冻结。

请建议我解决这个问题的最佳方法。我正在考虑以某种方式在不同的线程中构建模型,并最终将其发送到 TreeView,在那里它只会​​对新的模型执行 setModel(),但无法完成。

这是一些可以说明问题的代码:


感谢您的提示。这是我到目前为止的情况:每次刷新我都会构建一个新模型并将其发送到 TreeView ......它很快,但我不知道 TreeView 的当前模型发生了什么以及如何处理它,我的“应用程序”使用的内存似乎也在不断增加。

另一件事是我想保留我的选择,但基于项目数据,而不是可视矩形或行顺序,所以我也这样做了,但它看起来太脏/太难了,不是正确的方法。对此的任何帮助也将不胜感激。代码如下:

0 投票
1 回答
514 浏览

python - 在 pyqt 中,有没有办法向辅助线程(QThread)发出信号以引发异常

我在辅助线程中的运行函数如下所示:

这通常很好,因为任何异常都允许系统被清理并进入安全状态。我想在主线程中添加一个中止按钮,该按钮在辅助线程中引发异常。我试图在引发异常的 QThread 对象中创建方法,但是在触发信号时引发异常的是主线程。

有人知道 QThread 是否可以发出信号以在其自己的线程中异步引发异常?