小编Sai*_*iku的帖子

如何在CPU负载为100%时保持UI响应(主要使用C++和Qt)?

我在多线程应用程序中需要保持我的UI(和完整的操作系统)响应之间的问题.

我正在开发一个应用程序(基于c ++和Qt),它同时从多个流接收和转换大量视频帧.

每个流都在其自己的单独工作线程中检索,转换和呈现(使用DirectX).这意味着我没有使用默认的GUI线程来渲染帧.

在功能强大的计算机上我没有问题,因为cpu可以处理所有数据并为GUI线程留出时间来处理用户请求.但是在旧计算机上,它不起作用,CPU 100%用于处理我的数据,并且UI滞后,可能需要10秒才能处理按钮点击.

我想保持我的UI响应.事实上,我希望我的工作线程只有在没有其他动作要做时才能工作.我试图将工作线程优先级更改为低,但它不起作用.我也尝试在工作线程中进行睡眠(10),但因为我可以有很多线程,所以它们不会同时处于睡眠状态,因此它也无法正常工作.

在这种情况下保持UI响应的最佳方法是什么(无论工具包使用什么)?

c++ user-interface qt freeze

10
推荐指数
1
解决办法
1259
查看次数

C++使用双重比较的奇怪行为

我正在为我的应用程序开发一个单元测试,但是我遇到了一个我不明白的奇怪问题.

代码是:

double res = BytesTool::convertSize(1, BytesTool::Byte, BytesTool::KiloByte);
double tmp = pow((double)1000, -1);
QVERIFY(res == tmp);
Run Code Online (Sandbox Code Playgroud)

我正在使用Linux机器(主机64位)编译Linux 64位,使用gcc(主机64位),并使用Linux的mingw32编译器对Windows 32位进行交叉编译.

该程序在调试和发布模式下的Linux编译工作正常(断言成功).对于Windows版本,它在调试版本中工作正常,但不适用于发行版本; 断言失败了.

奇怪的是,如果我插入一个跟踪,测试在Windows中工作:

double res = BytesTool::convertSize(1, BytesTool::Byte, BytesTool::KiloByte);
printf("test");
double tmp = pow((double)1000, -1);
QVERIFY(res == tmp); // Is TRUE when printf("test") is present, FALSE otherwise
Run Code Online (Sandbox Code Playgroud)

我迷路了,我真的不明白发生了什么.为什么printf让它工作?

谢谢您帮忙.

c++ double

10
推荐指数
1
解决办法
242
查看次数

如何定义两个具有相同基类型的不同类型的C++构造函数

我有两个简单类型定义为int:

typedef int type_a;
typedef int type_b;
Run Code Online (Sandbox Code Playgroud)

我想为类中的每个类型创建一个构造函数.我尝试使用显式关键字,但它不起作用我得到一个编译消息"不能重载".

class Test {
public:
  explicit Test(type_a a){

  }
  explicit Test(type_b b){

  }
};
Run Code Online (Sandbox Code Playgroud)

将一种类型更改为无符号(typedef unsigned int type_b;)可以解决问题,但我确实希望保持两种类型的定义相同.

C++可以处理这种情况吗?

c++ constructor

3
推荐指数
1
解决办法
125
查看次数

标签 统计

c++ ×3

constructor ×1

double ×1

freeze ×1

qt ×1

user-interface ×1