2013-07-22 28 views
3

是的,我知道如何創建一個SDL線程。如何將其他參數發送到SDL線程?

int myfunc(void* data) 
{ 
    //my code... 
} 
SDL_CreateThread* mythread=SDL_CreateThread(myfunc,NULL); 

但如果我想要做的事,如:

int myfunc(void* data,int myparameter1,char myparameter2) 
{ 
    //my code... 
} 
SDL_CreateThread* mythread=SDL_CreateThread(myfunc,NULL,42,'c'); 

即如何創建一個功能的線程與一個以上的參數(參數不包括平時的「無效*數據」) 如果這是不可能的,你可以建議我可以通過一個參數傳遞給線程的任何方法?

回答

6

您可以在堆上創建一個struct,設置其字段與您的數據,那麼它的地址傳遞給SDL_CreateThread

typedef struct { 
    int param1; 
    char param2; 
} ThreadData; 

int myfunc(void* data) 
{ 
    ThreadData *tdata = data; 
    int param1 = tdata->param1; 
    char param2 = tdata->param2; 
    free(data); // depending on the content of `data`, this may have 
       // to be something more than a single `free` 
    //my code... 
} 
ThreadData *data = malloc(sizeof(ThreadData)); 
data->param1 = ...; 
data->param2 = ...; 
SDL_CreateThread* mythread=SDL_CreateThread(myfunc,data); 
+0

在我看來,要麼做一個'malloc' /'free'是多餘的,或將數據複製到線程的本地堆棧中。對? – yzt

+0

另外,我不確定是否需要連接SDL線程(或者這是否是常規),但如果是這樣,則需要知道堆分配情況或將參數複製到本地堆棧。這是因爲如果你在主線程中加入子線程,那麼主線程棧中參數的生命週期將保證包含子線程的生命週期。 – yzt

+1

@yzt:堆分配是爲了確保在線程查看它之前調用'SDL_CreateThread''的包含函數返回的數據不會被覆蓋。將變量複製到本地堆棧無非是展示如何使用'struct'成員;它可以/應該變成更明智的東西。 –

相關問題