我在多线程应用程序中需要保持我的UI(和完整的操作系统)响应之间的问题.
我正在开发一个应用程序(基于c ++和Qt),它同时从多个流接收和转换大量视频帧.
每个流都在其自己的单独工作线程中检索,转换和呈现(使用DirectX).这意味着我没有使用默认的GUI线程来渲染帧.
在功能强大的计算机上我没有问题,因为cpu可以处理所有数据并为GUI线程留出时间来处理用户请求.但是在旧计算机上,它不起作用,CPU 100%用于处理我的数据,并且UI滞后,可能需要10秒才能处理按钮点击.
我想保持我的UI响应.事实上,我希望我的工作线程只有在没有其他动作要做时才能工作.我试图将工作线程优先级更改为低,但它不起作用.我也尝试在工作线程中进行睡眠(10),但因为我可以有很多线程,所以它们不会同时处于睡眠状态,因此它也无法正常工作.
在这种情况下保持UI响应的最佳方法是什么(无论工具包使用什么)?
我正在为我的应用程序开发一个单元测试,但是我遇到了一个我不明白的奇怪问题.
代码是:
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让它工作?
谢谢您帮忙.
我有两个简单类型定义为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++可以处理这种情况吗?