Ik heb wat code geschreven dat, onder andere, primitieven(rectangles en arc's) op een GtkDrawingArea tekent.
Hiervoor gebruik ik een aparte thread(De informatie over de grootte e.d. wordt uit een socket gelezen), en voor het lezen van de packets en daadwerkelijk tekenen van de primitives gebruik ik een mutex. Nu krijg ik echter na een tijdje de volgende error:
Xlib: unexpected async reply (sequence 0x1d4c)!
Ik heb de redraw al proberen te throttle'en met een usleep() maar ook dat haalt niet veel uit, wellicht zie ik gewoon iets over het hoofd..
Hier is een samenvatting van de code die ik gebruik:
Wanneer ik de melding krijg is vrij varierend, soms ook niet, maar dan gebeurd het drawen niet erg soepel nonetheless.. Ik execute altijd met --sync
Iemand een idee ?
Hiervoor gebruik ik een aparte thread(De informatie over de grootte e.d. wordt uit een socket gelezen), en voor het lezen van de packets en daadwerkelijk tekenen van de primitives gebruik ik een mutex. Nu krijg ik echter na een tijdje de volgende error:
Xlib: unexpected async reply (sequence 0x1d4c)!
Ik heb de redraw al proberen te throttle'en met een usleep() maar ook dat haalt niet veel uit, wellicht zie ik gewoon iets over het hoofd..
Hier is een samenvatting van de code die ik gebruik:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| gtk_init(&argc, &argv); g_thread_init(NULL); .. mutex = g_mutex_new(); .. g_thread_create_full(network_thread_func, NULL, 0, FALSE, TRUE, G_THREAD_PRIORITY_URGENT, &error); .. for(;;) { recvfrom(netlink.sock, (gchar *)&incoming, sizeof(struct net_pkt_s), 0, (struct sockaddr *)&game.netlink.addr, &sa_len); g_mutex_lock(mutex); /* Het is hier een beetje simpified, natuurlijk, normaal worden de nieuwe waarden met de oude vergeleken * voordat er actie wordt ondernomen zodat hij niets teveel hoeft te tekenen, ook wordt er eerst met de bg_gc * over de oude rectangle heengetekend zodat je vervolgens alleen die nieuwe nog ziet. */ static gint x, y, bx, by; interpret_packet(&incoming, &x, &y, &bx, &by); gdk_draw_rectangle(screen.drawing_area->window, screen.drawing_area->style->fg_gc[GTK_WIDGET_STATE(screen.drawing_area)], TRUE, x, y, bwidth, bheight); g_mutex_unlock(mutex); .. usleep(10); } .. gdk_threads_enter(); gtk_main(); gdk_threads_leave(); |
Wanneer ik de melding krijg is vrij varierend, soms ook niet, maar dan gebeurd het drawen niet erg soepel nonetheless.. Ik execute altijd met --sync
Iemand een idee ?