我正在使用xlib,pthread和cairo编写多线程程序。 该程序创建一个线程,以便在点击事件后绘制十个点。
问题是:
在该计划获得三分之后,它崩溃并且xlib投诉
X Error of failed request: BadRequest (invalid request code or no such operation)
Major opcode of failed request: 0 ()
Serial number of failed request: 67
Current serial number in output stream: 97
但是,当我使用像“ strace ./a.out”这样的strace时,它可以正常工作。
这是我的代码片段:
void *draw_point(void *arg) { //paint random-postion point
int i = 0;
int seed;
double x ,y;
srand(seed);
cairo_set_source_rgba (cairo, 1, 0.2, 0.2, 0.6);
for(i = 0; i< 10; i++) {
x = rand() % 200;
y = rand() % 200;
if(candraw) {
cairo_arc (cairo, x, y, 10.0, 0, 2*M_PI);
cairo_fill (cairo);
}
hasdraw = true;
sleep(1);
}
return NULL;
}
bool win_main(void)
{
int clickx = 0, clicky = 0;
unsigned long valuemask;
XEvent event;
valuemask = ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | PointerMotionMask;
XSelectInput(display, win, valuemask);
pthread_t thread;
while (1) {
while (XPending(display) == 0) {
candraw = true;
if(hasdraw)
XFlush(display);
candraw = false;
}
XNextEvent(display, &event);
candraw = false;
switch (event.type) {
case MotionNotify:
//...
break;
case ButtonPress:
clickx = event.xbutton.x;
clicky = event.xbutton.y;
if(clicky < 50)
pthread_create(&thread, NULL, draw_point, NULL);
break;
case ButtonRelease:
//...
break;
default:
break;
}
}
return 0;
}
有没有人对这个奇怪的问题有所了解? 非常感谢!
答案 0 :(得分:1)
问题是由于两个线程试图同时访问显示器而使用多线程引起的。
strace将改变时间,因此线程在不同时间访问显示器。
Xlib确实具有防止冲突的功能。查找XInitThreads,它启用线程支持以及XLockDisplay和XUnlockDisplay,您需要在访问显示之前和之后从每个线程调用。