Qt 线程阻止 UI 响应

2024-04-18

我想我可能误解了Qt线程中的几个概念,

在我的窗口类中,它派生自 QWidget:

class Widget 
{
   Q_OBJECT
public:
   Widget::Widget (QObject *parent = 0) : QObject(parent)
   {
     moveToThread(&th); // still stuck
     connect (&th, SIGNAL(started()), SLOT(doWork())); 
     th.start();
   }
private:
   QThread th;
private slots:
  void doWork () 
  { 
     // hmm, this stuck the UI
     while (1) 
     { 
       qDebug() << "Sleeping"; 
     } 
  };
};

永远的循环卡住了 UI,这不应该是这样,因为它是由 QThread 调用的。 谁能指出这段代码有什么问题吗?


Widget::dowork()在主线程(GUI 运行的主线程)上执行,这就是它阻塞的原因。它是由 QThread 调用的并不重要。

在另一个线程上执行代码的正确方法是首先使用以下命令将 QObject 实例移动到 QThreadQObject::moveToThread(),然后连接started()将 QThread 的信号发送到要执行的 QObject 实例的插槽。

如果您想了解更多:https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong

您的代码的另一个问题是您试图将 QWidget 派生的对象移动到另一个线程。这是不允许的。 QWidget 实例必须保留在主线程上。相反,您应该从 QObject 子类化。

代码的另一个问题是您在构造函数中执行此操作。在对象尚未完全构建时将其移动到另一个线程只是自找麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 线程阻止 UI 响应 的相关文章

  • 在 Process Explorer 中调试 RtlUserThreadStart

    我有一个基于 3 5 构建的多线程 wpf 应用程序 当我通过 Process Explorer 查看正在运行的线程时 我看到 8 个线程都具有相同的起始地址 ntdll dll RtlUserThreadStart 并且所有 8 个线程的
  • Enthought Python 中的线程 FFT

    Numpy SciPy 中的快速傅立叶变换 FFT 不是线程化的 Enthought Python 附带 Intel MKL 数值库 该库能够进行线程 FFT 如何获得这些例程 以下代码适用于 Windows 7 Ultimate 64 位
  • 如何在C++、Qt、QML、Blackberry 10 Cascades Beta 3 SDK中制作图表/图形(如折线图、条形图、圆形图)等?

    我需要知道如何在 Blackberry 10 Cascades Beta 3 SDK QML Qt C 中制作图表 图表 如果有人可以向我展示一个例子或向我指出一些可以告诉我如何做到这一点的东西 我将不胜感激 您应该查看 QChart js
  • OpenMP 动态调度与引导调度

    我正在研究 OpenMP 的调度 特别是不同的类型 我了解每种类型的一般行为 但澄清一下何时进行选择会很有帮助dynamic and guided调度 英特尔的文档 https software intel com en us articl
  • JUnit、测试和线程

    当我连续运行多个 JUnit 测试时 JUnit 是否为每次执行创建一个新线程 或者所有内容都包装在一个线程中 Thanks 这一切都在一个线程上 您没有说明如何调用测试 但例如 运行 TestSuite 将按顺序运行套件中的所有测试 如果
  • 内核如何区分线程和进程

    Linux 中的线程被称为轻量级进程 无论是进程还是线程 它们的实现都是通过task struct数据结构 1 gt 那么 从这个意义上说 内核如何区分线程和进程 2 gt 当发生上下文切换时 线程如何在上下文切换中获得更少的开销 因为在此
  • valgrind 检测到分离 pthread 的数据争用

    我正在创建两个detached线程 pthread attr t tha1 void fun1 void return 0 void fun2 void return 0 int main pthread t th1 th2 pthread
  • 无法将 QMap 传递到 SLOT

    所以 这有效 h public slots void addMenu QString passedName signals void clicked const QString text cpp signalMapper new QSign
  • nUnit Assert.That委托并发问题

    我的代码中遇到了一些暂时的死锁 无法解决它 简单的代码 我无法创建一个简单的调用链来重现代码InvokeChangeEvent Test public async void Test sut InvokeChangeEvent foo fi
  • 如何将异步函数传递给 Python 中的线程目标?

    我有以下代码 async some callback args await some function 我需要将它作为目标传递给线程 thread threading Thread target some callback args som
  • 如何在点击 Qtablewidget 单元格时获取放置在该单元格中的小部件的行号?

    我正在尝试的是当用户选择项目时获取 QcomboBox 的行号 虽然使用它很容易获得单元格的列和行 cellClicked int int 信号 但仅当单元格上没有小部件时才有效 那么如果单元格中放置了小部件 如何获取行号 Note 所有组
  • 僵局澄清?

    也许对 死锁 还有其他解释 但据我所知 当发生死锁时两个线程各自等待一个资源 另一个 所以两者都无法继续 但我在这里看到了几个答案 它们声称长时间的等待 不互相等待 也是一个僵局 例子 1 https stackoverflow com a
  • 日志处理程序是否使用单独的线程?

    蟒蛇的日志处理程序 http docs python org library logging handlers html都很棒 其中一些 例如SMTP处理程序 http docs python org library logging han
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • 异步设计中如何知道哪个QNetworkReply属于QNetworkRequest?

    我可以轻松地用 C 进行异步设计 HttpResponseMessage response await httpClient GetAsync InputAddress Text run when request finished And
  • LegacyUnhandledExceptionPolicy 不允许捕获(并吞下)ThreadAbortException?

    我正在使用 NET 1 1 兼容模式来处理未处理的异常 问题是 当 LegacyUnhandledExceptionPolicy 设置为 1 这就是我想要的 时 我无法捕获并吞下 ThreadAbortException 示例代码 应用程序
  • 如何解决 MongoWaitQueueFullException?

    我运行一个java程序 它是一个线程执行程序 它将数千个文档插入到mongodb中的表中 我收到以下错误 Exception in thread pool 1 thread 301 com mongodb MongoWaitQueueFul
  • 构造函数中的同步块

    我有一个带有静态变量的类 如下所示 private static Object sMyStaticVar 如果我想在构造函数中为这个 var 赋值 我有这样的代码 if sMyStaticVar null sMyStaticVar new
  • 如何在 QTableWidget 的行和列中自动换行文本?

    I tried QTableWidget j new QTableWidget 10000 5 centralWidget j gt setColumnWidth 0 500 j gt setColumnWidth 1 30 j gt se
  • 在 NodeJS 中处理长时间运行的进程?

    我看过一些较旧的帖子涉及这个主题 但我想知道当前的现代方法是什么 用例是 1 假设您想要在视频文件上执行长时间运行的任务 例如 60 秒长 例如jspm install这最多可能需要 60 秒 2 不能对任务进行细分 其他要求包括 需要知道

随机推荐

  • 使用 Tkinter 将鼠标悬停在文本上时更改文本颜色?

    所以我在 Tkinter 的画布上有一堆文本 我想让它在鼠标悬停在文本上时文本颜色发生变化 对于我的生活 我不知道如何做到这一点 并且似乎没有很多关于 Tkinter 的信息 for city in Cities CityText Citi
  • 优化康威的“生命游戏”

    为了进行实验 我 很久以前 实施了康威的生命游戏 http en wikipedia org wiki Conway s Game of Life 而且我知道this https stackoverflow com questions 18
  • Tkinter 主窗口焦点

    我有以下代码 window Tk window lift window attributes topmost True 这段代码的工作原理是将我的 Tkinter 窗口显示在所有其他窗口之上 但它仍然只解决了一半的问题 虽然该窗口实际上显示
  • 将 lambda 函数应用于 dask 数据框

    我正在寻找申请lambda如果列中的标签小于一定百分比 则使用 dask 数据框的函数来更改列中的标签 我使用的方法适用于 pandas 数据框 但相同的代码不适用于 dask 数据框 代码如下 df pd DataFrame A ant
  • 将多个单元格添加到单行

    我对此很陌生 当我尝试将多个单元格添加到一行时 它说有不可读的内容 这是我所拥有的 SpreadsheetDocument ssDoc SpreadsheetDocument Create saveFile SpreadsheetDocum
  • 作为单独用户运行应用程序的最佳初始化脚本

    我有一个在用户帐户 基于 Plack 中运行的应用程序 并且需要一个初始化脚本 它看起来就像 sudo user start server 一样简单 我刚刚使用 start stop daemon 编写了一个 LSB 脚本 它确实很笨拙且冗
  • Apple HLS 中的 PES 数据包内的访问单元如何对齐?

    Apple 是否指定了这一点 PES 数据包有效负载中应放置多少个访问单元 另外 我想知道 PES 数据包中存在哪些前缀起始代码 如果有 我认为访问单元中第一个 NAL 单元之前的单元是无用的 不能放置 正确的 我想知道它是如何在 HLS
  • 使用 PHPUnit 和 Selenium 设置测试

    您能帮我设置测试环境吗 我在 Ubuntu 上运行 安装了 并运行 selenium Web 服务器 并通过 PHPUnit 执行我的测试 最有可能的是我陷入了一些小错误 但我现在不知道如何修复它 我的代码很简单 class WebTest
  • WPF Square 自动调整父容器大小

    我有一个UniformGrid我的 WPF 项目中的对象有 2 行和 3 列 其宽度和高度设置为自动 两种对齐方式都设置为拉伸 该网格将容纳 6squares我想尽可能多地填充他们的单元格 并水平和垂直居中 我需要添加什么才能允许方块根据父
  • 如何在localStorage中存储数组?

    我有一个数据属性 data return playWord baseWord result 并回应 baseWord Amazing 每次我在 api 中发送新请求时 基本词都会发生变化 我想将每个数据存储在本地存储中并将字符串值发送到 a
  • 具有区域格式的 NSDateFormatter

    我使用此代码来处理来自 json feed 的日期字符串 NSDateFormatter formatter NSDateFormatter alloc init formatter setDateStyle NSDateFormatter
  • 如何让 gif 动画在 WPF 中工作?

    我应该使用什么控制类型 Image MediaElement etc 我无法得到这个问题的最流行的答案 上面由达里奥 正常工作 结果是奇怪的 断断续续的动画和奇怪的伪影 到目前为止我找到的最佳解决方案 https github com Xa
  • Hibernate:是否可以在二级缓存中保存瞬态字段?

    我需要跟踪持久实体的字段 该字段会经常更改 并且实际上并不是该实体的功能 而是某种计算 有时 用户希望查看该计算结果 但这种情况非常罕见 每月一次左右 因此 必须以某种方式保存此计算的结果 但我想避免每次更改时都将其保存在数据库中 因为这每
  • “找不到类‘android.support.v4.app.FragmentActivity’”错误

    我收到以下错误 gt 02 06 23 10 24 104 E dalvikvm 912 Could not find class gt android support v4 app FragmentActivity referenced
  • 如何使用SVM求精确率、召回率、准确率?

    重复计算 Precision Recall 和 F Score https stackoverflow com questions 16927964 how to calculate precision recall and f score
  • 在 Yii 的视图中我应该更喜欢使用 widget 还是 renderPartial?

    当我应该在视图文件中使用自定义小部件或 renderPartial 时 我很困惑 有时我使用 widget 有时我使用 renderPartial Widget You use widget当您的应用程序逻辑定义在单独的类文件并且逻辑在某种
  • 将 C 字符串数组传递给 Fortran (iso_c_binding)

    如何传递 C 字符串数组 char cstrings 到 Fortran 子程序 问题使用 iso c binding 的 fortran C 桥接器中的字符串数组 https stackoverflow com questions 968
  • 在 Windows 上使用 PHP 获取总可用系统内存

    使用 PHP 我想获取系统可用的总内存 而不仅仅是空闲或已用内存 在 Linux 上 这非常简单 你可以做 memory fopen proc meminfo 然后解析该文件 有人知道 Windows 的等效方法吗 我愿意接受任何建议 编辑
  • 通过 UIPanGestureRecognizer 传递点击

    我想检测整个屏幕上的滑动 但是 屏幕包含UIButtons 如果用户点击这些按钮之一 我希望触发 Touch Up Inside 事件 我创建了一个UIView在我的屏幕顶部 并添加了一个UIPanGestureRecognizer在其上检
  • Qt 线程阻止 UI 响应

    我想我可能误解了Qt线程中的几个概念 在我的窗口类中 它派生自 QWidget class Widget Q OBJECT public Widget Widget QObject parent 0 QObject parent moveT