cuốn sách gpt4 ai đã làm

SDL_PollEvent khiến màn hình thức dậy sau khi tắt xset dpms

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 00:43:39 32 4
mua khóa gpt4 Nike

Tôi có một chương trình mà tôi có thể sử dụng xset dpms bật/tắt lực Bật và tắt màn hình và cũng có thể được gọi theo vòng lặp SDL_PollEvent(&e). sử dụng xset Sau khi tắt màn hình, bất kỳ SDL_Sự kiện thăm dò ý kiến Tất cả các cuộc gọi sẽ khiến màn hình thức dậy, ngay cả khi không có đầu vào. Tôi có thể bình luận SDL_Sự kiện thăm dò ý kiến được gọi nhưng điều đó không xảy ra. Tôi có cần phải làm gì đó với một sự kiện hoặc ngăn màn hình mở không? Sử dụng các bản cập nhật mã tối thiểu để tái tạo sự cố:

#include 
#include
#include
#include
#include
using namespace std;
nguyên tử SCREEN_ON(true);
nguyên tử CHẠY(đúng);
nguyên tử SERVER_CONNECTED(false);

std::string exec(const char *cmd) {
bộ đệm char [128];
std::string result = "";
std::shared_ptr pipe(popen(cmd, "r"), pclose);
nếu (!pipe)
ném std::runtime_error("popen() không thành công!");
while (!feof(pipe.get())) {
if (fgets(buffer, 128, pipe.get()) != NULL)
kết quả += bộ đệm;
}
return result;
}
nhân đôi get_time() {
const tĩnh Uint64 freq = SDL_GetPerformanceFrequency();
const tĩnh Uint64 Begin_time = SDL_GetPerformanceCounter();
Uint64 hiện tại = SDL_GetPerformanceCounter();
Uint64 đã trôi qua = hiện tại - start_time;
tần suất trả về (gấp đôi) đã trôi qua / tần suất (gấp đôi);
}

khoảng trống xử lý_input() {
SDL_Sự kiện e;
while (SDL_PollEvent(&e)){}
}

khoảng trống màn hình_thread() {
trong khi (ĐANG CHẠY) {
thời gian gấp đôi = get_time();
nếu (thời gian < 15)
MÁY CHỦ_CONNECTED = sai;
khác nếu (thời gian < 35)
SERVER_CONNECTED = đúng;
khác
MÁY CHỦ_CONNECTED = sai;

cout << "trạng thái máy chủ: " << SERVER_CONNECTED << endl;
cout << "trạng thái màn hình: " << SCREEN_ON << endl;

xử lý_input();
SDL_Delay(1000);

if (SCREEN_ON && (!SERVER_CONNECTED)) {
cout << "TẮT MÀN HÌNH\n";
SCREEN_ON = sai;
exec("sleep 1 && xset -display :0.0 dpms buộc tắt");
}
if ((!SCREEN_ON) && SERVER_CONNECTED) {
cout << "BẬT MÀN HÌNH\n";
SCREEN_ON = đúng;
exec("sleep 1 && xset -display :0.0 dpms buộc bật");
}
}
}

int main(int argc, char *argv[]) {
Uint32 initflags = SDL_INIT_TIMER |
SDL_Init(initflags);
Uint32 window_flags =
SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL |
SDL_Window *cửa sổ =
SDL_CreateWindow("title", 25, 25, 800, 600, window_flags);
SDL_SetRelativeMouseMode(SDL_TRUE);
SDL_EnableScreenSaver();
SDL_GLContext gl_context = SDL_GL_CreateContext(window);
glewInit();
chủ đề update_thread(monitor_thread);
glClearColor(1, 1, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
trong khi (ĐANG CHẠY) {
nếu (!SCREEN_ON) {
cout << "zzz...\n";
SDL_Delay(2000);
continue;
}
glClear(GL_COLOR_BUFFER_BIT);
SDL_Delay(16);
SDL_GL_SwapWindow(cửa sổ);
}
return 0;
}

Màn hình sẽ ở exec("sleep 1 && xset -display :0.0 dpms buộc tắt"); ngay sau khi tự mở lại và sau đó gọi lại để mở lại.

Không thành vấn đề, SDL_PollEvent chỉ có thể được gọi trong luồng chính.

câu trả lời hay nhất

gọi SDL_EnableScreenSaver() .

Thêm thông tin :

Tại sao SDL tắt trình bảo vệ màn hình của tôi theo mặc định?

Nhiều ứng dụng sử dụng SDL là trò chơi, trình bảo vệ màn hình hoặc trình phát đa phương tiện trong đó người dùng xem nội dung nào đó trong thời gian dài hoặc sử dụng đầu vào cần điều khiển thường không ngăn trình bảo vệ màn hình khởi động.

Bạn có thể tắt hành vi này bằng cách đặt biến môi trường: SDL_VIDEO_ALLOW_SCREENSAVER=1 Điều này có thể được đặt trên toàn cầu cho người dùng hoặc trên cơ sở từng ứng dụng trong mã.

Trong SDL 2.0.2 điều này cũng có thể được thay đổi bằng cách đặt gợi ý SDL_HINT_VIDEO_ALLOW_SCREENSAVER.

Ngoài ra, SDL 2.0 còn cung cấp chức năng SDL_EnableScreenSaver().

Về c++ - SDL_PollEvent khiến màn hình thức dậy sau xset dpms Force off , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/39914670/

32 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress