我正在嘗試在我的raycaster-type游戲中運行音樂,該游戲使用xwindows協議。我讀了一些關于multithreading的教程,但我不確定我是否明白。
我創建并執行了我的兩個threads,如下所示:
pthread_create(&song, NULL, ft_sound, NULL);
pthread_create(&dance, NULL, ft_go, &mega);
pthread_join(dance, NULL);
pthread_join(song, NULL);
其中ft_sound
是運行音樂的函數,ft_go
是運行raycaster的函數,mega
是存儲我所需的全部內容的結構。
以下是所討論的功能:
static void *ft_sound(void *vargp)
{
(void)(vargp);
sleep(10);
execlp("aplay", "aplay", "-q", "./music.wav", NULL);
return (NULL);
}
static void *ft_go(void *vargp)
{
t_mega *mega;
mega = vargp;
mega->win = mlx_new_window(mega->mlxp, mega->map.res[0], mega->map.res[1], "CUB3D");
ft_raycast(mega, &mega->eng, &mega->map, -1);
mlx_hook(mega->win, 3, 3, ft_key_press, mega);
mlx_loop(mega->mlxp);
ft_free_map(&mega->map);
return (NULL);
}
(mlx函數是我學校為這次約會定制的函數,它們處理game.的按鍵)
但只要歌一開始,舞蹈就結束了,即使我交換了連接線。如何使我的threads同時運行?
execlp("aplay", "aplay", "-q", "./music.wav", NULL);
用
aplay
的實例替換整個可執行文件(不僅僅是當前的thread)。因此,一旦調用execlp,光線跟蹤thread就消失了。如果您需要提供multithreaded解決方案,那么您必須找到一個庫,它可以在不調用外部實用程序的情況下播放音樂。或者,您可以只派生一個單獨的進程來執行aplay。(混合threads和叉子是可能的,但要小心一點。但似乎沒有任何必要here.)