- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
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()
.
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/
Tôi có một chương trình bật và tắt màn hình bằng cách sử dụng xset dpms Force bật/tắt và cũng gọi SDL_PollEvent(&e) trong một vòng lặp. Sau khi sử dụng xset để tắt màn hình, mọi phản hồi đối với SDL_PollEve
Tôi là một lập trình viên xuất sắc, rất giỏi!