- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在将 FUSE 与 qt5 放在一起。 Qt 和 FUSE 之间还没有桥梁,FUSE 主线程(产生其他工作的 FUSE 线程)和 QCoreApplication 只是并排运行。
但我希望能够使用 Qt 的 SIGNALS 和 SLOTS 在基于 QObject 的对象和 [0] 中所示的 pthread 的 Read(..) 函数之间发送和接收数据。
现在我想更改 [0] 中的 Read(..) 函数以使用 Qt 的 SIGNALS 和 SLOTS 从基于 QObject 的类中检索数据。从 pthread 发送信号有效但没有明确的 QEventLoop 我无法收到回复。因此我查看了 [1] 中的代码,它的设计非常出色,但我还没有让它工作。
伪代码(取自[1]):
QNetworkAccessManager qnam;
QNetworkReply *reply = qnam.get(QNetworkRequest(QUrl(...)));
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
/* reply has finished, use it */
看起来很有趣,我只需要一个类似于 QNetworkReply 的 QObject 派生类来处理请求。
当我使用该代码时,我遇到了一个问题,即我的 QNetworkReply 实现不会等待 loop.exec() 运行,然后循环不会接收到 finished() 信号。
但是没有比生成 QEventLoop 更容易的事情了吗?
注意:[1] 示例中的 QNetworkReply 和 QNetworkAccessManager 是在 pthread 中生成的,但是我需要能够使用 SIGNALS 和 SLOTS 与 QCoreApplication 的偶数队列进行通信,因为对象中的数据它来自不同的 QThread(在此 QCoreApplication 或特殊的 QThread)。
我还找到了 [2],也许:
connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection);
这就是我想要的,但我对此表示怀疑。
最佳答案
您可能面临的是 QNetworkAccessManager
internally uses threads to process http requests .这就是为什么它“不等待”你。修复它需要一个相当简单的修改:
QNetworkAccessManager qnam;
QEventLoop loop;
QNetworkReply *reply = qnam.get(QNetworkRequest(QUrl(...)));
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
if (!reply->isFinished()) loop.exec();
当作为信号源的对象存在于(实例化于)与具有槽的对象的线程不同的线程中时,连接将属于 QueuedConnection
。自动输入。
真正的问题是:每个 QObject
具有线程亲和性。默认亲和性是实例化对象的线程。您不应该直接从其他线程使用此类对象。
您可能正在做的是在同一个线程中实例化发送方和接收方对象,然后从另一个线程发出信号。这是潜在错误的根源,如果此类对象的用户强制进行非自动直接连接,则会导致未定义的行为。
无论何时emit object->signal(...)
,下面的不变量应该成立:
Q_ASSERT(QThread::currentThread() == object->thread());
随意在每个 emit()
前面添加那些不变的检查您明确执行的内容。
如果断言失败,需要使用QObject::moveToThread
将对象移动到要触发其信号的线程。你可以获得QThread
对于给定的 pthread
调用QThread::currentThread()
来自 pthread
中运行的代码. QThread
的实例将自动为您创建 :)
关于c++ - pthread 2 信号和槽包装器 mit QEventLoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19426900/
我正在使用 Qt5,QCoreApplication。为了允许可读和易于维护的代码,我需要在类/线程 A 中编写一个阻塞方法,它将发出信号,连接到不同线程 B 中的插槽,然后等待答案或超时在线程 B
我有一个必须在登录屏幕关闭之前更新的菜单屏幕。代码类似于下面的代码; emit updateMainMenuAccordingToUserRights; QCoreApplication::proce
我不确定问题的标题是否表述正确,因此为了解释我的真正意思,请考虑以下示例: 我创建了一个QApplication和一个QWidget,上面有一个QPushButton。然后,我将一个处理程序附加到来自
我有两个按钮:播放和暂停。还有我滑动条。 我想按下播放器来改变幻灯片的位置,直到发出一个事件,或者按下暂停键。为此,我正在使用 QEventLoop。 void MainWindow::slider(
我的问题很笼统,与 QT 中类 QEventLoop 的使用有关。我有两个主要问题。 问题 1) 它在 QT 内部如何工作(我主要关心的是为什么执行 QEventLoop 对象不会阻塞 QT 应用程序
我正在编写一个 Windows DLL,它可以在 QApplication 下运行,也可以在常规 Win32 应用程序下运行。我想使用需要事件循环的 Qt Networking 类。 如果在常规 Wi
QEventloop和QAbstractEventDispatcher有什么关系? Event loop is a loop that runs the event dispatcher until
我正在尝试根据特定架构验证 xml 文件。 因此,我将架构加载到 QXmlSchema 对象中。但我遇到了一些奇怪的错误。 我的代码如下所示: int main() { QUrl url("http:
我尝试使用 Qt 网络支持扩展在 Ubuntu/Linux 桌面下运行的旧程序。与这些库进行 LAN 通信需要运行 QEventLoop 的 .exec() 才能真正开始工作(即:接受连接、接收、发送
我的函数使用 QNetworkAccessManager 同时下载多个文件。然后它应该等待所有 QNetworkReply 回复完成,然后再继续其余代码。 但是我无法让 QEventLoop 处理多个
我有一个 Button 点击后连接到 myfunction,见下文。 我正在使用 QEventLoop,因为我正在等待一个事件,它会调用 _myEventLoop.exit(0); 当我连续两次单
问题 我目前正在将 FUSE 与 qt5 放在一起。 Qt 和 FUSE 之间还没有桥梁,FUSE 主线程(产生其他工作的 FUSE 线程)和 QCoreApplication 只是并排运行。 但我希
我有一个相当简单的应用程序,当我调用 QEventLoop::exec 时,它似乎在某些情况下死锁。应用程序在两种情况下调用此函数: 当某些数据到达套接字时 根据计时器事件 在这两种情况下,它都用于以
我在使用 QEventLoop 时遇到了问题。我想为我的单元测试创建一个“TimeBoundExerciser”,这样在 QEventLoop 上阻塞的 SUT 就不会阻塞其余的测试用例。具体来说
有一个包含 std::thread 的对象,我想在对象被销毁时完成。 最少的工作代码: #include #include #include struct Connector { Con
这个问题在这里已经有了答案: Why does calling quit() before exec() not quit the application? (2 个答案) 关闭 7 年前。 我创建
我正在尝试通过 QWebSocket 发送和接收消息,但不确定这一切在“用户同时按下所有按钮”场景中的安全性。 想象一下:有几个按钮触发通过 QWebSocket 发送的消息,它们接收并处理响应,然后
我读过有两种使用 QThread 的方法。 如果我有一个继承 QObject 的 Worker 类(如 http://mayaposch.wordpress.com/2011/11/01/how-to
我是一名优秀的程序员,十分优秀!