2012-10-29 13 views
1

因爲我已經得到這些錯誤:SDL_LockSurface()用於多線程

[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. 

編輯:我也得有時這種錯誤:

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

我試圖讓我的程序多線程安全等等在直接訪問像素之前,我正在調用SDL_LockSurface。

我知道,這些功能訪問像素:

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); 

是否有直接訪問像素的任何其它功能?

+0

@nos,那我該怎麼辦?我有幾個線程試圖訪問屏幕的特定區域。 –

回答

2

SDL_LockSurface用於直接訪問像素,它與多線程無關。

SDL只允許您從一個線程訪問其庫函數 - 初始化庫和視頻子系統的函數,這適用於大多數gfx或UI庫。

您必須拉出主線程中的像素副本,並將它們分發到其他線程進行處理。 (如果在處理完像素後需要再次顯示某些內容,請將結果彙總回主線程)

+0

你的意思是我應該複製一份我試圖更新的'SDL_Surface'? –

+0

@ l19不,你必須做的不止於此,你必須從SDL_Surface中提取像素,並將它們放入例如一個無符號的字符數組,並操縱它。您不能在另一個線程的SDL_Surface上進行操作。 – nos

+0

當你說「並將結果匯​​回主線程」時,你究竟是什麼意思? –