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

multithreading - 实现 QThread 的正确方法是什么...(请举例...)

QThread 的 Qt 文档说要从 QThread 创建一个类,并实现 run 方法。

以下摘自 4.7 Qthread 文档...

要创建自己的线程,继承 QThread 并重新实现 run()。例如:

因此,在我创建的每一个线程中,我都做到了这一点,并且对于大多数事情来说它工作得很好(我没有在我的任何对象中实现 moveToThread(this),它工作得很好)。

上周我遇到了一个障碍(通过在我创建对象的地方工作来解决它)并找到了以下博客文章。这里基本上说子类化 QThread 确实不是正确的方法(并且文档不正确)。

这是来自 Qt 开发人员,所以乍一看我很感兴趣,经过进一步思考,同意他的观点。遵循 OO 原则,您真的只想对一个类进行子类化以进一步增强该类......而不是直接使用类方法......这就是你实例化的原因......

可以说我想将自定义 QObject 类移动到线程......“正确”的做法是什么?在那篇博客文章中,他“说”他在某处有一个例子……但如果有人可以进一步向我解释,将不胜感激!

更新:

由于这个问题引起了如此多的关注,这里是 4.8 文档的复制和粘贴,其中包含实现 QThread 的“正确”方式。

我仍然认为值得指出的是,它们包含一个Worker::workerThread不必要的额外成员,并且从未在他们的示例中使用过。删除那块,它是如何在 Qt 中进行线程化的正确示例。

0 投票
4 回答
13190 浏览

c++ - 找不到包含文件 QtCore?

我正在用 C++ 编写一个多线程程序,并计划使用QThread. 问题是当我尝试#include <QtCore>......我得到一个错误......Cannot find include file QtCore.

是什么赋予了?

0 投票
1 回答
1064 浏览

multithreading - 从非 UI QThread 修改 QStandardItemModel?

我有 Qt4 应用程序,它绑定QStandardItemModelQListView并从后台/非 UI 线程更新模型。

有时,当从非 UI 线程非常重复地调用QStandardItem'方法时,应用程序将在 la dataChanged(..) 处理程序处崩溃。我可以通过在 for 循环中重复setText(..)调用来重现该问题。setText("xxxxx")在我的应用程序中,数据是从网络读取的,因此我在单独的非 UI 线程中更新模型。

这是普通的pb吗?如果我理解正确,这与排队连接有关并且QStandardItemModel不是线程安全的?如何解决这个问题?

谢谢!

0 投票
1 回答
408 浏览

c++ - 为什么我不能从内部调用一个类的 start 函数?

我对线程编程完全陌生,而且由于该类使用的是 QThreads,我想知道为什么我不能start从自身内部调用 QThread 的函数并让它的run函数独立于另一个线程开始执行(当我做这个)。相反,我必须从声明对象的任何地方调用 start 函数。为什么是这样?

一些代码:

这基本上就是我的班级所做的。当我调用someFunction程序崩溃。如果我从中删除该start语句someFunction,并start从程序外部调用,那么它可以正常工作。

0 投票
1 回答
393 浏览

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_thinkers的槽相连。当所有s 完成后,调用.finished()ThinkerThread::subThinkerFinished()_sub_thinker_sub_thinkerThinkerThread::subThinkerFinished()quit()

还有一个地方quit()叫:

从主线程,执行如下:

  • thinker.tryKill() [注意:在第一次运行时,thinker 没有运行。]
  • thinker.start()

thinkerfinished()信号与 连接autoMove()

对于 Qt 的所有早期版本,在从autoMove()调用之后thinker::quit()调用ThinkerThread::subThinkerFinished()。在 4.7 中,我看到它autoMove()是在第一次调用 之后调用的thinker.tryKill(),即使线程没有运行。

任何的想法?

当然,我可以检查内部ThinkerThread::tryKill()是否thinker正在运行。但我想知道为什么会这样。

谢谢。

0 投票
2 回答
14132 浏览

qt - 在 QT 的不同线程中运行函数

在 Qt 应用程序代码Class A中有一个成员方法,例如method1(). 我想在另一个成员函数中调用此方法method2()mehtod1()在不同的线程中运行。但是我从 qt 文档中找到的内容如下。

  1. 从继承一个新的class MyThread(假设)QThread
  2. run()用您需要的代码覆盖函数方法。
  3. 创建一个 in 对象,MyThread然后Class A在任何你想要的地方调用 run 函数。

但以上似乎有点复杂。Qt 中是否有任何机制,以便我可以QThread立即在我的线程中创建一个新的(不继承)method1()并使用该线程运行,然后在执行完成后method2()返回?method1()

如果我的问题不清楚,请告诉我。

0 投票
1 回答
1421 浏览

qt - 文件复制操作在单独的线程中不起作用?

我正在尝试在其他线程中运行复制文件的代码,这样它就不会冻结应用程序的 GUI。

我发现它似乎不适用于单独的线程。

为什么它不工作?

0 投票
1 回答
3279 浏览

pyqt4 - PyQt:如何处理来自 QThread 的 QPixmaps?

这一定是我在使用 PyQT 时遇到的最大麻烦:我已经为我的应用程序编写了一个缩略图线程(我必须对大量的大图像进行缩略图),而且看起来它可以工作(而且几乎可以)。SIGNAL我的主要问题是每当我从我的线程发送此错误消息时:

我不知道如何解决这个问题。我尝试QIcon通过我的 传递 a SIGNAL,但这仍然会产生相同的错误。如果有帮助,这里是处理这些东西的代码块:

Thumbnailer班级:

调用线程的部分(当一组图像被拖放到列表框时发生):

我不知道如何处理这种东西,因为我只是一个 GUI 新手;)

谢谢大家。

0 投票
5 回答
11363 浏览

multithreading - 如何使用 QTimer 每 10 秒向 QTextBrowser 打印一条消息?

我已经为此工作了几个小时,无法弄清楚,也找不到任何有效的在线帮助。基本上,我想要完成的要点是拥有一个带有按钮和QTextBrowser. 当我按下按钮时,我希望它显示一条消息,然后每 10 秒继续打印此消息。

我想我会使用 QTimer,因为有一个计时器每 10 秒显示一次消息是有意义的。当我最初将它实现到我的 `buttonClicked() SLOT 中时,它导致程序冻结。我在网上寻找解决方案,发现 QApplication::processEvents()。

所以基本上在我的功能中我有这样的东西:

我认为它会打破 timer.isActive() while 循环,但它不会简单地停留在那里。

所以我认为这是一个线程问题。所以我想出了如何使用 QThreads 但我仍然无法让它工作。基本上,当我创建一个带有计时器的线程并且线程告诉计时器启动时,程序关闭并且控制台显示“程序意外完成”。

必须有一个简单的方法来做到这一点,但我使用 Qt 的记录一直是

0 投票
1 回答
1032 浏览

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 秒。