C 如何在事件驱动的X-lib程序中引入可实现的延迟?
我正在编写一个X-server显示代码来显示球从一个像素位置到下一个位置的移动,在执行以下代码后打开的新窗口中可以看到。在运行代码时,我可以得到5个红色填充的圆圈,它们被认为是球。代码可以运行得非常快,实时计算就像2-3毫秒,这是显而易见的,在窗口上所有的5个球同时显示 我想在两者之间引入一些延迟,这样我就可以看到球从一个像素位置移动到另一个像素位置。为此,我应该向给定的代码中添加什么?我希望有某种计时器或中断,以便在一段时间内停止执行,同时从一个地方切换到另一个地方,并且可以在窗口中看到 代码:C 如何在事件驱动的X-lib程序中引入可实现的延迟?,c,graphics,x11,xlib,xserver,C,Graphics,X11,Xlib,Xserver,我正在编写一个X-server显示代码来显示球从一个像素位置到下一个位置的移动,在执行以下代码后打开的新窗口中可以看到。在运行代码时,我可以得到5个红色填充的圆圈,它们被认为是球。代码可以运行得非常快,实时计算就像2-3毫秒,这是显而易见的,在窗口上所有的5个球同时显示 我想在两者之间引入一些延迟,这样我就可以看到球从一个像素位置移动到另一个像素位置。为此,我应该向给定的代码中添加什么?我希望有某种计时器或中断,以便在一段时间内停止执行,同时从一个地方切换到另一个地方,并且可以在窗口中看到 代码
}在XNextEvent之前,在XConnectionNumberdpy上调用select并指定所需的超时时间,.Hi n.m.,在每次像素打印后只需调用XFlush和sleep即可。在每次循环迭代中使用usleep
#include <stdio.h>
#include <X11/Xlib.h>
#include <math.h>
Display *display;
Window window;
XSetWindowAttributes attributes;
XGCValues gr_values;
XFontStruct *fontinfo;
GC gr_context;
Visual *visual;
int depth;
int screen;
XEvent event;
XColor color, dummy;
main (argc, argv)
char *argv[];
int argc;
{
display = XOpenDisplay(NULL);
screen = DefaultScreen(display);
visual = DefaultVisual(display,screen);
depth = DefaultDepth(display,screen);
attributes.background_pixel = XWhitePixel(display,screen);
window = XCreateWindow( display,XRootWindow(display,screen),
200, 200, 750, 200, 5, depth, InputOutput,
visual ,CWBackPixel, &attributes);
XSetStandardProperties(display,window,"Welcome","Hi",None,NULL,0,NULL);
XSelectInput(display,window,ExposureMask | KeyPressMask) ;
fontinfo = XLoadQueryFont(display,"6x10");
XAllocNamedColor(display, DefaultColormap(display, screen),"red",
&color,&dummy);
gr_values.font = fontinfo->fid;
gr_values.foreground = color.pixel;
gr_context=XCreateGC(display,window,GCFont+GCForeground, &gr_values);
XFlush(display);
XMapWindow(display,window);
XFlush(display);
int i,j,a,a1,a2,a4,a5,b1,b2,b4,b5,b,h,w,angle1,angle2;
while(1){
XNextEvent(display,&event);
switch(event.type){
case Expose:
//Make a circle using arc, and then fill it with a color
a = 200; a1=520; a2=750;a4=400;a5=1050;
b = 200;b1=100; b2=300;b4=400;b5=500;
h = 10, w = 10;
angle1 = 0, angle2 = 360*64;
//Some delay I may need to introduce here ??
XFillArc(display, window, gr_context, a-(w/2), b-(h/2), w, h, angle1, angle2);
XFillArc(display, window, gr_context, a1-(w/2), b1-(h/2), w, h, angle1, angle2);
XFillArc(display, window, gr_context, a2-(w/2), b2-(h/2), w, h, angle1, angle2);
XFillArc(display, window, gr_context, a4-(w/2), b4-(h/2), w, h, angle1, angle2);
XFillArc(display, window, gr_context, a5-(w/2), b5-(h/2), w, h, angle1, angle2);
break;
case KeyPress:
XCloseDisplay(display);
exit(0);
}
}