问题标签 [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.
multithreading - 实现 QThread 的正确方法是什么...(请举例...)
QThread 的 Qt 文档说要从 QThread 创建一个类,并实现 run 方法。
以下摘自 4.7 Qthread 文档...
要创建自己的线程,继承 QThread 并重新实现 run()。例如:
因此,在我创建的每一个线程中,我都做到了这一点,并且对于大多数事情来说它工作得很好(我没有在我的任何对象中实现 moveToThread(this),它工作得很好)。
上周我遇到了一个障碍(通过在我创建对象的地方工作来解决它)并找到了以下博客文章。这里基本上说子类化 QThread 确实不是正确的方法(并且文档不正确)。
这是来自 Qt 开发人员,所以乍一看我很感兴趣,经过进一步思考,同意他的观点。遵循 OO 原则,您真的只想对一个类进行子类化以进一步增强该类......而不是直接使用类方法......这就是你实例化的原因......
可以说我想将自定义 QObject 类移动到线程......“正确”的做法是什么?在那篇博客文章中,他“说”他在某处有一个例子……但如果有人可以进一步向我解释,将不胜感激!
更新:
由于这个问题引起了如此多的关注,这里是 4.8 文档的复制和粘贴,其中包含实现 QThread 的“正确”方式。
我仍然认为值得指出的是,它们包含一个Worker::workerThread
不必要的额外成员,并且从未在他们的示例中使用过。删除那块,它是如何在 Qt 中进行线程化的正确示例。
c++ - 找不到包含文件 QtCore?
我正在用 C++ 编写一个多线程程序,并计划使用QThread
. 问题是当我尝试#include <QtCore>
......我得到一个错误......Cannot find include file QtCore.
是什么赋予了?
multithreading - 从非 UI QThread 修改 QStandardItemModel?
我有 Qt4 应用程序,它绑定QStandardItemModel
到QListView
并从后台/非 UI 线程更新模型。
有时,当从非 UI 线程非常重复地调用QStandardItem
'方法时,应用程序将在 la dataChanged(..) 处理程序处崩溃。我可以通过在 for 循环中重复setText(..)
调用来重现该问题。setText("xxxxx")
在我的应用程序中,数据是从网络读取的,因此我在单独的非 UI 线程中更新模型。
这是普通的pb吗?如果我理解正确,这与排队连接有关并且QStandardItemModel
不是线程安全的?如何解决这个问题?
谢谢!
c++ - 为什么我不能从内部调用一个类的 start 函数?
我对线程编程完全陌生,而且由于该类使用的是 QThreads,我想知道为什么我不能start
从自身内部调用 QThread 的函数并让它的run
函数独立于另一个线程开始执行(当我做这个)。相反,我必须从声明对象的任何地方调用 start 函数。为什么是这样?
一些代码:
这基本上就是我的班级所做的。当我调用someFunction
程序崩溃。如果我从中删除该start
语句someFunction
,并start
从程序外部调用,那么它可以正常工作。
c++ - QThread混乱
我在Windows 7 Ultimate(32 位)机器上使用Qt 4.7.0(32 位)。我可能从 4.0 或 4.2 版本开始使用 Qt,并且几乎使用了所有4.xy版本。
最近,使用 Qt 4.7 我遇到了麻烦。
我在一些旧版本的 Qt 中编写了一个多线程应用程序。我忘记了版本,但我编译并正确运行的最后一个版本可能是 4.5.x 或 4.6.x。螺纹部分似乎在 4.7 中不能正常工作,或者我误解了一些东西。这是问题所在:
主线程启动thinker
线程。下面是线程的run()
功能:thinker
的信号与所有_sub_thinker
s的槽相连。当所有s 完成后,调用.finished()
ThinkerThread::subThinkerFinished()
_sub_thinker
_sub_thinker
ThinkerThread::subThinkerFinished()
quit()
还有一个地方quit()
叫:
从主线程,执行如下:
- thinker.tryKill() [注意:在第一次运行时,thinker 没有运行。]
- thinker.start()
thinker
的finished()
信号与 连接autoMove()
。
对于 Qt 的所有早期版本,在从autoMove()
调用之后thinker::quit()
调用ThinkerThread::subThinkerFinished()
。在 4.7 中,我看到它autoMove()
是在第一次调用 之后调用的thinker.tryKill()
,即使线程没有运行。
任何的想法?
当然,我可以检查内部ThinkerThread::tryKill()
是否thinker
正在运行。但我想知道为什么会这样。
谢谢。
qt - 在 QT 的不同线程中运行函数
在 Qt 应用程序代码Class A
中有一个成员方法,例如method1()
. 我想在另一个成员函数中调用此方法method2()
并mehtod1()
在不同的线程中运行。但是我从 qt 文档中找到的内容如下。
- 从继承一个新的
class MyThread
(假设)QThread
。 run()
用您需要的代码覆盖函数方法。- 创建一个 in 对象,
MyThread
然后Class A
在任何你想要的地方调用 run 函数。
但以上似乎有点复杂。Qt 中是否有任何机制,以便我可以QThread
立即在我的线程中创建一个新的(不继承)method1()
并使用该线程运行,然后在执行完成后method2()
返回?method1()
如果我的问题不清楚,请告诉我。
qt - 文件复制操作在单独的线程中不起作用?
我正在尝试在其他线程中运行复制文件的代码,这样它就不会冻结应用程序的 GUI。
我发现它似乎不适用于单独的线程。
为什么它不工作?
pyqt4 - PyQt:如何处理来自 QThread 的 QPixmaps?
这一定是我在使用 PyQT 时遇到的最大麻烦:我已经为我的应用程序编写了一个缩略图线程(我必须对大量的大图像进行缩略图),而且看起来它可以工作(而且几乎可以)。SIGNAL
我的主要问题是每当我从我的线程发送此错误消息时:
我不知道如何解决这个问题。我尝试QIcon
通过我的 传递 a SIGNAL
,但这仍然会产生相同的错误。如果有帮助,这里是处理这些东西的代码块:
Thumbnailer
班级:
调用线程的部分(当一组图像被拖放到列表框时发生):
我不知道如何处理这种东西,因为我只是一个 GUI 新手;)
谢谢大家。
multithreading - 如何使用 QTimer 每 10 秒向 QTextBrowser 打印一条消息?
我已经为此工作了几个小时,无法弄清楚,也找不到任何有效的在线帮助。基本上,我想要完成的要点是拥有一个带有按钮和QTextBrowser
. 当我按下按钮时,我希望它显示一条消息,然后每 10 秒继续打印此消息。
我想我会使用 QTimer,因为有一个计时器每 10 秒显示一次消息是有意义的。当我最初将它实现到我的 `buttonClicked() SLOT 中时,它导致程序冻结。我在网上寻找解决方案,发现 QApplication::processEvents()。
所以基本上在我的功能中我有这样的东西:
我认为它会打破 timer.isActive() while 循环,但它不会简单地停留在那里。
所以我认为这是一个线程问题。所以我想出了如何使用 QThreads 但我仍然无法让它工作。基本上,当我创建一个带有计时器的线程并且线程告诉计时器启动时,程序关闭并且控制台显示“程序意外完成”。
必须有一个简单的方法来做到这一点,但我使用 Qt 的记录一直是
c++ - QThreads 的并发问题。接收相同信号的线程相互阻塞
因此,我正在开发一个实时处理视频的程序,并且在线程“阻塞”彼此时遇到了一些麻烦。
我的系统几乎是这样设置的:
(所有这些类都在扩展 QThread。)
因此 DataSourceThread 从视频流中获取帧并向接收器发出包含该帧的信号。连接类型:Qt::DirectConnection
接收器基本上接收 DataSourceThread 发出的帧,如果处理器完成对前一帧的处理,它将向处理器发出包含该帧的信号。连接类型:Qt::QueuedConnection。 如果处理器没有完成对前一帧的处理,它只会返回而不发出信号(跳帧)。
为了测试这是否有效,我所做的只是让 Processor1 在收到帧时打印一条消息,而 Processor2 执行QThread::sleep(3); 并打印出一条消息。
(在将帧传递给处理器之前,接收器还将对帧进行深度复制。)
预期结果:
Processor1 应该不断地打印消息。Processor2 应该每 3 秒打印一次消息。
问题:
两个处理器同时打印它们的消息(每 3 秒)。Processor1 等到 Processor2 完成后再打印它的消息。所以输出几乎是这样的:
等等。
我在这里没有想法,所以任何帮助将不胜感激!
编辑: 这是一些代码:
主.cpp:
从 DataSourceThread.cpp:
帧接收器.cpp:
GUIThread.cpp:(处理器 1)
帧处理器.cpp
DetectorThread (Processor2)的作用与 guithread 相同,但在 setFrame 中休眠 3 秒。