我的应用程序从网络获取数据并在场景中绘制(场景使用手工制作的OpenGL引擎).
它可以工作几个小时.当我不使用我的桌面时,我的显示器因显示器电源管理器信令(dpms)关闭.然后,当我触摸鼠标或键盘时,显示器打开,应用程序挂起(X也挂起).
如果我这样做
xset -dmps
操作系统不使用dpms并且应用程序工作稳定.
这些问题出现在Centos 6和Archlinux中,但是当我在Ubuntu 12.10下运行应用程序时,它运行得很好!
我尝试了不同的NVidia驱动程序.没有效果.
我尝试使用ssh进行远程登录并使用gdb附加到进程.打开监视器后,我无法在进程表中找到该应用程序.
如何诊断问题?当显示器关闭/打开时会发生什么(在OpengGL环境中)?使用dpms时,Ubuntu是否做了一些特别的事情?
我们猜测问题的原因!当监视器关闭时,我们失去了OpenGL上下文.当监视器唤醒时,应用程序挂起(无上下文).根据操作系统的不同,行为的差异是由于监视器连接不同:Kubuntu的监视器连接VGA电缆.所以(可能)它对X行为没有影响.
\xd0\xa1an 有人向我解释一下这个测试程序的结果吗?
\n\n#include <QApplication>\n#include <QDebug>\n#include <QFontMetrics>\nint main(int argc, char *argv[])\n{\n QApplication app(argc, argv);\n QFont font;\n font.fromString("Monospace,14");\n QFontMetrics fm(font);\n qDebug() << "W : " << fm.width(\'W\');\n qDebug() << "8*W : " << 8*fm.width(\'W\');\n qDebug() << "WWWWWWWW: " << fm.width("WWWWWWWW"); // 8*W\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n用 Qt5.11 编译这段代码后,我得到这样的结果:
\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\nW : 11\n8*W : 88\nWWWWWWWW: 92\n
这种等宽字体的一个字符“W”的大小是 11。我预计由 8 个这样的字符组成的字符串的大小应该是 88。但是 QFontmetrics::width 返回 92!
\n#include <memory>
class Data;
std::unique_ptr<Data> p;
//class Data{}; // not working without this
int main(){}
Run Code Online (Sandbox Code Playgroud)
使用g ++ - 5编译此代码会出现这样的错误:
将'sizeof'无效应用于不完整类型'数据'
有人可以解释为什么我取消注释第四行编译会成功吗?据我所知,在第3行编译器没有关于类型数据的完整信息.我们这行只有前瞻性声明.真实声明发生在第4行.
int a;
auto *pa = reinterpret_cast<unsigned long long*>(&a);
*pa = 10;
Run Code Online (Sandbox Code Playgroud)
int 和 unsigned long long 类型具有不同的大小。这段代码会产生未定义的行为吗?