问题标签 [qmutex]

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 回答
1745 浏览

c++ - Qt中线程之间共享的像素图

我有一个主要的 GUI 类和另一个 Worker 类:第一个处理 GUI 事物(将 a 绘制QPixmap到 a 中QGraphicsScene),第二个处理计算事物(将QLines 和QPoints 绘制到 that 上QPixmap)。这两个类在两个不同的线程中运行。当我创建Worker线程时,我将 GUI 的地址传递QPixmapWorker类,因此它们共享同一个对象。

在类QPixmap中修改,在Worker类中绘制GUI。即使我没有任何问题,我还是决定使用 a来确保我的程序在绘制时QMutex不会尝试访问。QPixmap现在,为了做到这一点,我QMutex在 GUI 类和类之间进行了共享WorkerWorker类又有一个指向 GUI 的指针QMutex)。QPixmap每当我阅读或修改QMutex.

这是一种有效的方法吗?到目前为止,我从未遇到过错误,但我想知道它在逻辑上是否正确以及 Qt 是否提供了更好的方法来实现这一点。

先感谢您。

0 投票
1 回答
516 浏览

c++ - 在 QAbstractTableModel 中使用多个线程之间共享的数据

我有一个使用Q_GLOBAL_STATIC包含必须从多个线程访问的数据结构的单例类实现,我在类中实现了访问器函数,它将在访问数据之前锁定互斥锁,以便对共享数据的所有访问都被序列化。

问题是我想QAbstractTableModeldata(). 但我认为这还不够,因为在对另一个线程的两个后续调用之间可能会跳入并更改项目的数量,例如 ( ),并且模型的线程最终可能会访问越界数据。columnCount()rowCount()data()rowCount()

columnCount()我想我需要在模型重置的第一次调用和模型重置之前锁定互斥锁rowCount(),并且只有在将所有数据读入模型时(在最后一次调用之后data())才解锁它,有没有办法这样做?还是我想错了?

我想在模型重置时将共享数据结构复制到本地数据结构(并且仅在复制操作上锁定互斥锁),然后安全地访问复制的数据,但这不是矫枉过正吗?没有更有效的解决方案吗?

0 投票
1 回答
695 浏览

c++ - QMutex 与 QConcurrent::run 没有按预期工作?

我正在制作一个 Qt GUI 应用程序,它使用自定义QLabel类(名称为ImageInteraction)来显示来自流式摄像机的图像,同时还允许鼠标在图像上交互。由于 GUI 具有其他功能,定制的 QLabel 类完成从相机中提取图像并通过while在另一个线程中运行的函数中的循环更新其显示的图像的工作。代码如下:

Here captureis of typecv::VideoCapture并且loopContinue是一个布尔类型,最初设置为true. 有一个closeEvent()函数调用停止从相机捕获图像的方法。

其中stopVideoThread只需将布尔标志设置loopContinuefalse并具有以下简单代码:

据我了解,一旦方法被调用并设置为 false while,方法中的循环loadVideo应该停止。但实际上,当按下关闭按钮时,显然它不会停止循环并且应用程序崩溃并显示一条消息:stopVideoThreadloopContinuewhile

我是否错误地使用QtConcurrent::run了方法和QMutex对象?你能确定问题是什么吗?仅供参考,操作系统是 ubuntu 14.04,IDE 是 QtCreator。

谢谢!

0 投票
1 回答
97 浏览

python - 在父 pyqt 中使用等待条件时,子 GUI 不显示

我是 PyQt 编码的新手。我正在尝试从父进程启动子进程(GUI)。在这个我使用等待条件和互斥体来理解它的功能。这是我的代码:

如果我执行此代码,它不会启动子 GUI,就好像我在 Parent 类中取消注释 waitCondition.wait(mutex) 并运行它,GUI 会显示出来。

有人可以帮我找出我在这里犯的错误吗?

0 投票
2 回答
353 浏览

c++ - 在执行 buttonReleased() 之前等待 buttonPressed() 插槽完成

pressed()我有一个 QPushButton 可以对released()信号执行冗长的操作。在执行插槽的操作之前,如何确保我完成了buttonPressed()插槽的所有操作buttonReleased()

我已经尝试过使用 QMutex,但是当尝试在按钮释放时锁定时,程序似乎陷入了无限循环,此时互斥锁仍被buttonPressed()函数锁定:

我的主窗口.h:

我的主窗口.cpp:

0 投票
1 回答
391 浏览

qt - Qt,如何锁定 SQLite 数据库以进行多次操作

我有一个用户使用的 QML 应用程序。有一个计时器可以监听服务器的工作订单,然后将所有信息插入应用程序中的 SQLite db。用户还可以在 SQLite 中更改数据(更新、删除等)。我的问题是,如何防止对 SQLite 表进行多操作。只有一个操作必须对 SQLite 生效(select,delete,insert,update....)我不知道但是,Mutex.lock 结构可以用于此。或者 SQLite 上的多个操作是否有问题

0 投票
1 回答
330 浏览

multithreading - 检查哪个线程锁定了 QMutex

在我们的数据库程序中做某事时,我面临一个奇怪的死锁。关键点是当线程试图锁定 a 时QMutex

这使程序卡住了。

我很困惑,因为没有其他线程 - AFAIK - 可以访问这个互斥锁。我现在要做的是找出哪个线程锁定了它。我怎么能那样做?

0 投票
1 回答
1748 浏览

python - 如何使用 Python3 在 pyqt5 中正确锁定 Qthreads

我对 python 比较陌生,但能够运行一个相当有用的程序来处理大量数据。我可以使用另一个 python 脚本顺序地在多组数据上运行它以串行调用程序,但我想创建一个 GUI 并使用多线程来允许其他人在不了解编程的所有细节的情况下使用它。我成功创建了 GUI,并且可以使用信号和插槽双向馈送数据。我遇到的问题是创建具有相同功能的多个线程。

我做了一些研究,似乎该函数需要是线程安全的,不幸的是我的不是因为我使用的是来自 scipy 的curve_fit(),它不是线程安全的。所以,根据我在这个论坛和其他人的阅读,我应该使用 mutex.lock(),但是在调用 curve_fit() 时我得到“SystemError: null argument to internal routine”

这是一些示例代码来演示我所做的事情:

在另一个文件中,我有作为线程调用的主函数:

我可以成功运行只调用一个线程的代码,但是如果我调用多个线程,那么输出窗口会为每个调用的线程打印出“waypoint2”,然后崩溃并出现我上面提到的系统错误。

我究竟做错了什么?我是否需要使用单独的进程而不是 Qthreads?我误解了线程是如何工作的吗?我希望它们在独立变量空间中运行。

0 投票
1 回答
823 浏览

qt - QTimer超时和QMutex交互

假设我们有一些基本的计时器和一个定期调用的插槽。

我也有来自同一个对象的函数,它强制更新并返回一些值。

这个函数可以直接从不同的线程调用。这让人想到线程安全的问题。简单的互斥锁getLatestState将无济于事,因为在极少数情况下getLatestState会从另一个启动的线程调用updateState。同时可能会发生定时器超时。你能帮我妥善处理这种情况吗?

0 投票
1 回答
297 浏览

multithreading - 从子 QThread 创建 QMutexLocker 时崩溃

我有 QMutex 和 QQueue 作为基于 QThread 的类的成员。我在 popEvent 和 pushEvent 方法中锁定 QMutex(通过 QMutexLocker)。当我将它锁定在从主线程调用的 push 方法中时,它可以工作。当我从子线程循环调用 pop 函数时,它在创建 QMutexLock 时崩溃。怎么了?QMutex 和 QQueue 应该是全局的还是静态的?基于 QThread 的类是在主线程堆(堆而不是堆栈)上创建的。