Re: [問題] 背景音樂的實現??

看板C_and_CPP (C/C++)作者 (阿干)時間16年前 (2009/05/31 17:43), 編輯推噓3(3030)
留言33則, 3人參與, 最新討論串2/2 (看更多)
以下是我寫的多執行緒 我在遊戲開始時先執行backMusic的執行緒 在遊戲結束時執行checkOver的執行緒 但背景音樂仍然不會停止 int isOver = 0;//為一個全域變數 void backMusic( void *x ) { while ( isOver == 0 ) { mciSendString( "seek Gaming.wav to start", 0, 0, 0 ); mciSendString( "play Gaming.wav", 0, 0, 0 ); for ( long long int i = 0; i < 16800000000; ++i ); if ( isOver ) mciSendString("stop Gaming.wav", 0, 0,0); } _endthread(); } void checkOver( void *x ) { isOver = true; } 可以幫我看看為什麼嗎??? 第一次碰多執行緒 有什麼太蠢的地方請見諒 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.143.153.233 ※ 編輯: AGanPTT 來自: 220.143.153.233 (05/31 17:44)

05/31 17:49, , 1F
把 isOver 宣告成 volatile 試試看
05/31 17:49, 1F

05/31 17:54, , 2F
error C4430: 遺漏型別規範 - 假設為 int。
05/31 17:54, 2F

05/31 17:54, , 3F
注意: C++ 不支援 default-int
05/31 17:54, 3F

05/31 17:55, , 4F
出現了這個= = COMPILE不會過耶
05/31 17:55, 4F

05/31 17:57, , 5F
volatile int isOver = 0 不行嗎?
05/31 17:57, 5F

05/31 17:59, , 6F
因為這個例子看起來比較像是 isOver 被編譯起優化造成的
05/31 17:59, 6F

05/31 17:59, , 7F
恩 不行= =
05/31 17:59, 7F

05/31 17:59, , 8F
如果沒亂調執行緒優先權的話,加 volatile 應該能解決
05/31 17:59, 8F

05/31 18:00, , 9F
我都沒調過什麼= = VC2008
05/31 18:00, 9F

05/31 18:08, , 10F
我是寫CONSOLE不是MFC
05/31 18:08, 10F

05/31 18:14, , 11F
原來是volatile int isOver; 我只用volatile isOver;
05/31 18:14, 11F

05/31 18:15, , 12F
但還是一樣 音樂仍然不會停止
05/31 18:15, 12F

05/31 18:16, , 13F
您要不要測試一下停止那行指令確實是有效的 = =
05/31 18:16, 13F

05/31 18:23, , 14F
有效
05/31 18:23, 14F

05/31 18:25, , 15F
這樣說不過去耶, 不然你下中斷點在 isOver = true 及 stop
05/31 18:25, 15F

05/31 18:26, , 16F
指令那邊, 確定他們有執行到, 照目前情況來看, 應該是其中
05/31 18:26, 16F

05/31 18:27, , 17F
一行沒有執行到, 這樣說合理吧?
05/31 18:27, 17F

05/31 18:32, , 18F
執行完checkOver他就離開了 backMusic並沒有去檢查isOver
05/31 18:32, 18F

05/31 18:32, , 19F
請問該怎麼寫他才會去執行他呢??
05/31 18:32, 19F

05/31 18:39, , 20F
已解決= = 我蠢了我= =
05/31 18:39, 20F

05/31 18:39, , 21F
for ( long long int i = 0; i < 16800000000; ++i )";"
05/31 18:39, 21F

05/31 18:39, , 22F
迴圈會跑完才檢查= =
05/31 18:39, 22F

05/31 18:40, , 23F
喔, 原來如此 @_@
05/31 18:40, 23F

05/31 18:40, , 24F
小弟第三次遇到了, 只有第一次幫人家看的時候有發現 @_@
05/31 18:40, 24F

05/31 20:49, , 25F
試了mciSendString,其實他播放音樂好像會自己開新的執行緒跑
05/31 20:49, 25F

05/31 20:50, , 26F
所以可能不用新開一個執行緒,特地去做play
05/31 20:50, 26F

05/31 22:34, , 27F
為了循環 所以才開心執行緒 不循環的確可以這樣
05/31 22:34, 27F

06/01 07:24, , 28F
mciSendString(TEXT("open C:\1.wav type mpegvideo"),0,0,0);
06/01 07:24, 28F

06/01 07:24, , 29F
mciSendString(TEXT("play C:\1.wav repeat"),0,0,0); 這樣應
06/01 07:24, 29F

06/01 07:25, , 30F
該就會repeat,MSDN好像是指waveaudio不支援repeat,所以才加
06/01 07:25, 30F

06/01 07:25, , 31F
type mpegvideo,如果是*.mp3是可以直接open後play repeat
06/01 07:25, 31F

06/01 07:26, , 32F
修正一下,應該是open C:\\1.wav才對
06/01 07:26, 32F

06/01 11:40, , 33F
我執行stop指令 竟然當機= =
06/01 11:40, 33F
文章代碼(AID): #1A8b4z1P (C_and_CPP)
文章代碼(AID): #1A8b4z1P (C_and_CPP)