gpt4 book ai didi

c++ - 如何允许工作线程更新 X11 窗口?

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:42 25 4
gpt4 key购买 nike

我有一个我试图修改的应用程序,以便工作线程可以告诉窗口用新数据更新自身。

变量定义如下:

Display *d;
Window w;
XEvent exppp;

窗口使用以下代码启动:

XEvent e;

d = XOpenDisplay(NULL);
if (d == NULL)
return 0;

s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 800, 1,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapWindow(d, w);

while (1) {
XNextEvent(d, &e);
if (e.type == Expose || e.type == KeyPress) {
// redraw routine goes here
}
}

我试图用来让窗口重绘的是一个可以被另一个线程调用的函数:

void graphical_out::redraw()
{
exppp.type = Expose;
XSendEvent(d, w, false, Expose, &exppp);
}

并且窗口只有在调整大小或接收到按键时才会自行更新。这似乎有点像新手问题,但谷歌在这个问题上让我失望了。对我做错了什么有什么建议吗?

最佳答案

  1. 您对 XSendEvent 的论点是错误的。您需要传递 mask (ExposureMask),而不是事件类型。
  2. exppp.xexpose.window = w; 是必需的(XSendEvent 的窗口参数不是 XEvent 的窗口 结构)。
  3. 在发送之前清除事件:memset(&exppp, 0, sizeof(exppp));,以防万一。
  4. Xlib 不是线程安全的,从多个线程调用它的函数可能是危险的。

UPDATE 在多线程程序中,需要到处调用 XFlush(尽管永远不能保证多线程与 Xlib 一起工作)。

这段代码对我有用:

#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <memory.h>

Display *d;
Window w;
int s;

void* tp (void* q)
{
XEvent exppp;

while (1)
{
sleep (3);
printf ("Sending event of type Expose\n");
memset(&exppp, 0, sizeof(exppp));
exppp.type = Expose;
exppp.xexpose.window = w;
XSendEvent(d,w,False,ExposureMask,&exppp);
XFlush(d);
}
return NULL;
}


int main ()
{
XEvent e;
pthread_t thread;

d = XOpenDisplay(NULL);
if (d == NULL)
return 0;

s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 800, 1,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapWindow(d, w);

pthread_create(&thread, NULL, tp, NULL);

while (1) {
XNextEvent(d, &e);
if (e.type == Expose) {
printf ("Got Expose event%s\n", e.xexpose.send_event ? " (SendEvent)" : "");
}
else if (e.type == KeyPress) {
printf ("Got KeyPress event%s\n", e.xkey.send_event ? " (SendEvent)" : "");
}
}
}

它可能对您有用,也可能会失败。 Xlib 不是线程安全的,使用风险自负。

关于c++ - 如何允许工作线程更新 X11 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10785491/

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