问题标签 [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 回答
1447 浏览

qt - QThread/QDialog 的竞争条件

我试图在以下情况下避免竞争条件:

当线程在 QDialog::exec() 设置对话框之前完成时,由信号触发的“accept()”调用将丢失,对话框不会自行关闭...

所以理想情况下,我只想在对话框准备好处理它之后才启动线程,但我该怎么做呢?

0 投票
3 回答
713 浏览

multithreading - 关于 QThread 的问题

如果我创建一个 QThread 并从另一个线程调用它的一个插槽,它将在 QThread 对象的线程的上下文中调用,还是从进行调用的线程的上下文中调用?

0 投票
3 回答
7262 浏览

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 不会失败,因此参数不是问题,而是通过单独的工作线程调用该方法。

0 投票
2 回答
15642 浏览

c++ - Qt moveToThread() vs 调用新线程我们什么时候使用每个

我们什么时候在线程应用程序中使用每个函数调用。给定在同一个类中定义的两个函数 fun1() 和 fun2() 处理将数据读/写到缓冲区(队列操作)。对这些实现多线程。我们将不得不在单独的线程中运行这两个函数。现在假设第一个函数 read 在其线程开始时被调用。

在第一个函数线程开始时使用 moveTothread (第二个线程)进行函数写入会更好吗

或者

在新线程类中定义第二个函数并在第一个线程开始时调用该线程。

0 投票
3 回答
1320 浏览

qt - 帮我了解QThread的用法

我有MainWindow w窗户,并且TestThread testThreadw. 我知道这很简单,但我不能testThread.foo()在线程中运行该方法testThread(而不是在窗口线程中)。换句话说:我不理解 QThread 的行为。

请帮助更正下一个测试应用程序。有一个QProgressBar *MainWindow::ui::progressBarand QPushButton *MainWindow::ui::startButton(简单写)。我想开始(通过startButton单击)TestThread::foo(int* progress),它将int progress每秒递增。

主窗口:

测试线程:

我知道,这很简单。我做错了什么:)

PS我想运行最简单(尽可能)的示例来了解QThread行为。

谢谢!

0 投票
1 回答
977 浏览

c++ - 将正在运行的线程中的函数移动到新线程?

我在类文件中有一个读写功能。这个类是类的子QThread类并覆盖了run,没有信号和槽,它基本上在一个线程中运行数据处理函数。在它的构造函数中是方法movetothread(this)。要让这两个函数组成一个队列并实现多线程,我可以movetothread(secondthread)在 write 函数中调用吗?

使 write 函数在单独的线程上运行。写入功能如何以及何时停止?

0 投票
2 回答
538 浏览

c++ - c ++在第一类的构造函数中创建第二类的对象 - 多线程

我有两个班一和二。两者都运行线程。第二类是线程化在第一类中声明的函数。这是通过在第二个类的 run 方法中调用它来完成的。我试图在一个的构造函数中调用/启动线程二,以便这两个线程一起运行。我得到范围错误。由于缺少语法。代码如下

代码旁边的注释中给出的错误是 .

错误:未在此范围内声明“二”

错误:预期的';' 在'b'之前

错误:未在此范围内声明“b”

我缺少什么语法?

0 投票
1 回答
3163 浏览

c++ - c ++ qthread同时启动2个线程

我有两个线程一和二。由它们各自在头文件中的类定义。我想在第一个线程启动时启动第二个线程。在第一个的构造函数中创建和启动第二个线程产生了意外的结果。我的头文件“header.h”

我的类文件“main.cpp”

这是我期望输出如何运行的工作代码。

编辑:更改了代码,以便现在两个线程都正确独立

我如何启动第二个线程和第一个线程,而不在 main ie 中显式调用两个。

线程二的调用和处理应该由线程一来完成。

0 投票
1 回答
2419 浏览

c++ - 了解 qthread 子类的运行方法和线程上下文

我有一个有很多方法的编码器类。这是 Qthread 的子类。我是多线程的新手

试图了解此类如何线程化其方法

...我理解线程必须在 qthread 的子类中的方法。并且 this 的运行实现了这个类的线程代码。并且该线程仅在调用此类对象的 start 方法时才启动。

问题: 首先你从这个运行实现中推断出什么

问题:线程上下文相对于它的方法意味着什么。

问题:如果在这个类的线程开始之前调用这个类的一个方法会发生什么

0 投票
4 回答
5034 浏览

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 从不打印。这里有一个竞争条件,需要知道事件循环何时开始才能修复它。

也许我错过了一些东西,问题是不同的......

如果您真的阅读了所有内容,非常感谢!呸!