问题标签 [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.
qt - QThread/QDialog 的竞争条件
我试图在以下情况下避免竞争条件:
当线程在 QDialog::exec() 设置对话框之前完成时,由信号触发的“accept()”调用将丢失,对话框不会自行关闭...
所以理想情况下,我只想在对话框准备好处理它之后才启动线程,但我该怎么做呢?
multithreading - 关于 QThread 的问题
如果我创建一个 QThread 并从另一个线程调用它的一个插槽,它将在 QThread 对象的线程的上下文中调用,还是从进行调用的线程的上下文中调用?
qt - 在主线程外创建 QDialog 的方法
我正在尝试在 QT 中创建一个客户端应用程序,它需要处理线程和可变数量的窗口实例。但是我很难弄清楚如何在一个处理线程中创建一个新窗口。我知道所有 ui 元素必须在与 QApplication 类相同的线程中创建,但我需要能够实例化,或者至少在另一个线程中有对 QDialog 的引用。
线程和QDialog之间的通信可以使用信号来完成,我不担心这个,但实际上创建窗口是另一回事。我可以使用信号告诉主线程为窗口创建一个实例,然后以某种方式检索指向它的指针,但对我来说这似乎有点复杂和丑陋。有没有更好的方法来完成这样的任务?在主线程之外创建 QDialog 是否存在 QApplication 类?
编辑: 我试过 Q_INVOKABLE 方法,但它不能跨线程工作。我创建了一个视图工厂类,它可以创建一个我指定的类型的 QDialog 并返回一个指向它的指针。此类已在主 GUI 线程中实例化,并且对此类的引用被发送到任何工作线程。问题是,当线程使用 Qt::BlockingQueuedConnection 从工厂调用 create 方法时,invoke 方法会失败。如果我将其更改为 Qt::DirectConnection,invoke 方法将调用正确的 create 方法,但在当前线程中作为工作线程。
我的主要功能如下所示:
ClientApp 线程中的运行函数看起来像这样:
就像我说的,如果我将连接类型更改为 Qt::DirectConnection,invokeMothod 不会失败,因此参数不是问题,而是通过单独的工作线程调用该方法。
c++ - Qt moveToThread() vs 调用新线程我们什么时候使用每个
我们什么时候在线程应用程序中使用每个函数调用。给定在同一个类中定义的两个函数 fun1() 和 fun2() 处理将数据读/写到缓冲区(队列操作)。对这些实现多线程。我们将不得不在单独的线程中运行这两个函数。现在假设第一个函数 read 在其线程开始时被调用。
在第一个函数线程开始时使用 moveTothread (第二个线程)进行函数写入会更好吗
或者
在新线程类中定义第二个函数并在第一个线程开始时调用该线程。
qt - 帮我了解QThread的用法
我有MainWindow w
窗户,并且TestThread testThread
是w
. 我知道这很简单,但我不能testThread.foo()
在线程中运行该方法testThread
(而不是在窗口线程中)。换句话说:我不理解 QThread 的行为。
请帮助更正下一个测试应用程序。有一个QProgressBar *MainWindow::ui::progressBar
and QPushButton *MainWindow::ui::startButton
(简单写)。我想开始(通过startButton
单击)TestThread::foo(int* progress)
,它将int progress
每秒递增。
主窗口:
测试线程:
我知道,这很简单。我做错了什么:)
PS我想运行最简单(尽可能)的示例来了解QThread
行为。
谢谢!
c++ - 将正在运行的线程中的函数移动到新线程?
我在类文件中有一个读写功能。这个类是类的子QThread
类并覆盖了run,没有信号和槽,它基本上在一个线程中运行数据处理函数。在它的构造函数中是方法movetothread(this)
。要让这两个函数组成一个队列并实现多线程,我可以movetothread(secondthread)
在 write 函数中调用吗?
使 write 函数在单独的线程上运行。写入功能如何以及何时停止?
c++ - c ++在第一类的构造函数中创建第二类的对象 - 多线程
我有两个班一和二。两者都运行线程。第二类是线程化在第一类中声明的函数。这是通过在第二个类的 run 方法中调用它来完成的。我试图在一个的构造函数中调用/启动线程二,以便这两个线程一起运行。我得到范围错误。由于缺少语法。代码如下
代码旁边的注释中给出的错误是 .
错误:未在此范围内声明“二”
错误:预期的';' 在'b'之前
错误:未在此范围内声明“b”
我缺少什么语法?
c++ - c ++ qthread同时启动2个线程
我有两个线程一和二。由它们各自在头文件中的类定义。我想在第一个线程启动时启动第二个线程。在第一个的构造函数中创建和启动第二个线程产生了意外的结果。我的头文件“header.h”
我的类文件“main.cpp”
这是我期望输出如何运行的工作代码。
编辑:更改了代码,以便现在两个线程都正确独立
我如何启动第二个线程和第一个线程,而不在 main ie 中显式调用两个。
线程二的调用和处理应该由线程一来完成。
c++ - 了解 qthread 子类的运行方法和线程上下文
我有一个有很多方法的编码器类。这是 Qthread 的子类。我是多线程的新手
试图了解此类如何线程化其方法
...我理解线程必须在 qthread 的子类中的方法。并且 this 的运行实现了这个类的线程代码。并且该线程仅在调用此类对象的 start 方法时才启动。
问题: 首先你从这个运行实现中推断出什么
问题:线程上下文相对于它的方法意味着什么。
还
问题:如果在这个类的线程开始之前调用这个类的一个方法会发生什么
c++ - 知道 QThread 的事件循环何时从另一个线程开始
在我的程序中,我将 QThread 子类化,并run()
像这样实现了虚拟方法:
现在,在另一个线程(我们称之为MainThread
)中,我启动ManagerThread
并等待它的started()
信号,之后我继续使用应该由ManagerThread
. 但是,started()
信号本质上run()
是在调用之前发出的,所以根据线程调度,我会丢失一些来自MainThread
的信号,因为事件循环还没有开始!
(编辑:原来这不是问题,只是信号没有及时连接,但出于同样的原因)
我可以在打电话之前发出信号exec()
,但这也是自找麻烦。
是否有任何确定/简单的方法可以知道事件循环已经开始?
谢谢!
EDIT2:(解决方案)
好吧,事实证明问题并不完全是我所说的。事件循环没有开始的事实不是问题,因为信号应该排队直到它开始。问题是,一些信号无法及时连接到被调用——因为started()
信号在run()
被调用之前发出。
解决方案是在所有连接之后和 exec 之前发出另一个自定义信号。这样可以确保连接所有信号/插槽。
这是我的问题的解决方案,但不是线程标题的真正答案。我已经接受了确实回答了标题的答案。
我将所有代码留给那些好奇的人,解决方案是等待instance()
方法中的另一个信号。
代码:
你们中的许多人都说我不能丢失信号,所以这是我的全班实现。我会将其简化为最基本的必需品。
这是接口ManagerThread
:
一些相关的实现。创建线程的单例实例:
重新实现设置信号/槽并启动事件循环的运行:
将处理委托给正确线程的函数。这是我发出丢失信号的地方:
最后,MainThread
如果事件循环没有及时启动,下面的代码将会失败:
假设处理程序只是打印出它的文本,下面是成功运行时打印出的内容:
等待 ManagerThread 启动
完成等待 ManagerThread 线程启动。
在 ManagerThread 中启动事件循环
ManagerThread 试图做某事
BLAM!
以下是不成功运行时会发生的情况:
等待 ManagerThread 启动
完成等待 ManagerThread 线程启动。
ManagerThread 试图做某事
在 ManagerThread 中启动事件循环
显然,事件循环在信号发出后开始,并且 BLAM 从不打印。这里有一个竞争条件,需要知道事件循环何时开始才能修复它。
也许我错过了一些东西,问题是不同的......
如果您真的阅读了所有内容,非常感谢!呸!