Программа такая:
Код:
...
int main(int argc, char *argv[]) {
... // Инициализация
... // иксов
bi=XCreateImage(display, vis, 24, ZPixmap, 0, im1.b, WIDTH_MIN, HEIGHT_MIN, 32, WIDTH_MIN*4);
// Пока не знаю, нужно ли заполнять чем-нибудь структуру vis
bi->red_mask =0xFF0000; // Не знаю
bi->green_mask=0xFF00; // нужны ли
bi->blue_mask =0xFF; // эти строки
XInitImage(bi);
pthread_attr_init(&attr);
pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);
pthread_create(&pid,&attr,out_graph,0);
/************ Цикл получения и обработки ошибок ************/
while(1) {
XNextEvent(display,&report); // Взять очередное событие из очереди
switch(report.type) {
...
}
}
void *out_graph(void *arg) {
... // Описание внутренних переменных
while(1) {
... // "Рисование" изоюражение в массиве im1
XPutImage(display,window, gc, bi, 0,0, 30,5, 740, 556);
usleep(10000);
}
}
Сначала думал, что проблема в новом процессоре (GEODE LX), т.к. на моём основном Celeron'е программа работала.
Пришёл домой -- запускаю на Athlon'е -- аналогичная картина: после запуска програииа завершается а на экране остаётся:
Код: Выделить всё
$ ./osc
osc: ../../src/xcb_io.c:228: _XSend: Assertion `!dpy->xcb->request_extra' failed.
Аварийный остановКогда из функции out_graf убрал вызов XPutImage(... то программа стала работать и из основного тела вызов этой функции (по нажатию клавиши) проходит без проблем
Возникла даже мысль про процессоры AMD, т.к. на работе проверял ещё на серверном Pentium'е.
Но на уже староватом Duron'е 750, на котором стоит Etch r0 программа работает почти нормально (почти -- потому, что не всегда сразу реагирует на клавиатуру. Но нажатия не теряет)
Подозреваю, что причина в конкуренции за вывод в окно, т.к. программа иногда может и запуститься и будет нормально выводить картинку из потока. Но только до того, пока не попробуешь что-то сделать в основной части программы.
Как мне решить эту проблему?
P.S. Гуглинг по xcb_io.c выдал довольно много ссылок с похожими сообщениями, более того, было даже сообщение:
т.е., как я понял, под 7-й Федорой программа работала, а под более новой 8-й работать не захотела.On Fedora 8, the new X11 is breaking programs like nmrDraw from NMRPipe.
The program runs fine under Fedora 7 but fails under Fedora 8 with the error...
nmrdraw: xcb_io.c:285: _XAllocID: Assertion `!(dpy->flags & (1L << 3))' failed.
Abort
Но сообщение там было другое и, позоже, автор проблему тоже не решил.