gpt4 book ai didi

c++ - 使用 XLib 截屏会卡住我的电脑

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:45 27 4
gpt4 key购买 nike

所以我一直在尝试使用 XLib,我尝试用 C++ 编写一个程序,它可以简单地截取屏幕截图并将其显示在窗口中,从而创建一种隧道效果。它工作得很好,只有几秒钟。然后我的电脑(顺便说一句,运行 Ubuntu)开始以非常非常慢的帧速率运行,我的鼠标几乎没有响应,关闭窗口无法停止它,按 ctrl-c 也无法停止它,然后它只是完全死机,我别无选择,只能使用电源按钮手动关闭并重新启动计算机(之后,它似乎工作正常?)。

现在,XLib 是一个非常奇怪的库,没有很好的文档,所以我知道我基本上做错了什么,但我的代码太简单了,我不知道它会是什么。我已经尝试过各种方法(注释掉某些功能,使用 usleep 在帧之间暂停它),但是当它不起作用并且必须重新启动计算机时,每一个新想法都会令人沮丧。那么也许你们中有人知道发生了什么事?

这是我的代码:

#include <X11/Xlib.h>
int main(){
//Initializes some values
Display* display=XOpenDisplay(0);
Window root=DefaultRootWindow(display);
XWindowAttributes att;
XGetWindowAttributes(display, root, &att);
//att.width and att.height now are the width and height of the screen
int screen=DefaultScreen(display);
Window window=XCreateSimpleWindow(display, root, 0, 0,
att.width, att.height, 1,
BlackPixel(display, screen),
WhitePixel(display, screen));
GC graphics=XCreateGC(display, window, 0, NULL);

//puts window on screen
XMapWindow(display, window);
while(1){
//This gets the screenshot
XImage* ximg=XGetImage(display, root, 0, 0,
att.width, att.height,
AllPlanes, ZPixmap);
//This puts the screenshot in the window "window"
XPutImage(display,window, graphics, ximg,
0,0,0,0, att.width, att.height);
//frees the data allocated to ximg
XFree(ximg);
}
}

(这应该用简单的 g++ screentest.cpp -lX11 编译)

就其值(value)而言,我尚未从中收集到任何解决方案的一些信息丰富的网页是:

The man page for XGetImage and XPutImage

The man page for XFree, although I really don't think this is the problem

This Stack Overflow question seems relevant - but it doesn't have any answers

我还查看了相当多的其他 Stack Overflow 问题,虽然有相当多的问题看起来可能相关,但我没有看到任何与我的问题直接相关的内容。

感谢您提供的任何帮助。

最佳答案

您说您添加了代码以在调用之间休眠。那将是一件好事。尝试增加比您已经尝试过的更长的 sleep 间隔。

还可以考虑使用计数器,这样您就不会永远调用它。我猜这个问题要么是内存使用失控,要么只是一个无限循环。无论哪种方式,输入一些东西,这样程序就会自行停止,而不是依赖您手动退出。

关于c++ - 使用 XLib 截屏会卡住我的电脑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27697965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com