2012-10-29 3 views
1

Depuis que je reçois ces erreurs:SDL_LockSurface() pour le multithreading

[xcb] Unknown request in queue while dequeuing 
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called 
[xcb] Aborting, sorry about that. 
main: ../../src/xcb_io.c:178: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed. 

EDIT: Je reçois aussi cette erreur parfois:

XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0" 
    after 48888 requests (48888 known processed) with 0 events remaining. 

Je suis en train de faire mon multithread programme sûr si Je mets des appels à SDL_LockSurface avant d'accéder directement aux pixels.

Je sais que ces fonctions accèdent aux pixels:

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect); 
int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); 

Existe-t-il d'autres fonctions qui accèdent directement aux pixels?

+0

@nos, alors que dois-je faire? J'ai plusieurs threads essayant d'accéder à une zone particulière de l'écran. –

Répondre

2

SDL_LockSurface est utilisé pour obtenir un accès direct aux pixels, il n'a aucun rapport avec le multi-threading. SDL vous permet uniquement d'accéder à sa fonction de bibliothèque à partir d'un thread - celui qui a initialisé la bibliothèque et le sous-système vidéo, cela s'applique à la plupart des bibliothèques gfx ou UI.

Vous devez extraire une copie des pixels du thread principal et les distribuer aux autres threads pour traitement. (Et rassemblez le résultat dans le fil principal si vous avez besoin d'afficher à nouveau quelque chose après avoir traité les pixels)

+0

Vous voulez dire que je devrais faire une copie de la 'SDL_Surface' que j'essaie de mettre à jour? –

+0

@ l19 Non, vous devez faire plus que cela, vous devez extraire les pixels de la SDL_Surface, les placer par ex. un tableau char non signé, et manipuler cela. Vous ne pouvez pas utiliser sur une SDL_Surface, une copie ou non, à partir d'un autre thread. – nos

+0

quand vous avez dit "et assembler le résultat dans le fil principal" que vouliez-vous dire exactement? –