找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
尊貴會員無限使用任何功能尊貴會員無限觀看附件圖片儲值後自動升級用戶組
office火影銀魂3dgdadobe無碼 ge
mird 237カマボコ僕の女神fb特輯71lafbd川村まやぱっつん

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

(4月新番)[繁]關於我

(4月新番)[繁]魔法科

關於我轉生變成史萊姆

❖四月新番【簡】無名

[簡]被稱為廢物的原英

4月新番[繁體]約會大
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 2542|回復: 1
打印上一主題下一主題

[問題]thread 用法--小炸彈超人(物件)[複製鏈接]

帖子
82
積分
19 點
潛水值
13860 米
跳轉到指定樓層
樓主
發表於 2015-1-6 02:05 AM|只看該作者|倒序瀏覽
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
最近在做期末專題炸彈超人(規定要用成物件),努力查的結果是炸彈計時這個一定得用到多執行緒thread但我又還沒學過,先用以前做過的小遊戲改編測試炸彈,暫時先不考慮跑出地圖外等其他的問題
目前遇到的問題:
1.thread 本身好像是物件,所以沒辦法再直接呼叫物件的函式
2.不清楚thread.join()該放在甚麼地方
如果放在判斷炸彈結束前的位置,那在倒數計時前人物得等它做完才能繼續
...
瀏覽完整內容,請先 註冊登入會員
附件: 你需要登錄才可以下載或查看附件。沒有帳號?註冊
分享分享0收藏收藏0支持支持0
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

bkmambaaaa 該用戶已被刪除
頭香
發表於 2015-1-8 11:55 PM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
本帖最後由 bkmambaaaa 於 2015-1-9 12:34 AM 編輯

試試看:
  1. #include <iostream>     // cout
  2. #include <thread>       // thread, this_thread::sleep_for
  3. #include <chrono>       // chrono::seconds
  4. #include <functional>   // ref
  5. #include <mutex>        // mutex
  6. using namespace std;

  7. mutex mtx_stdout; // mutex for stdout

  8. class Bomber {
  9. protected:
  10.     int bombcount;
  11.     mutex mtx_bc; // mutex for bombcount;

  12. public:
  13.     Bomber() : bombcount(0) {}
  14.     void boom();
  15.     void bomb_print();
  16.     static void time(Bomber &b);
  17. };

  18. void Bomber::boom() {
  19.     if(0==bombcount) {
  20.         mtx_bc.lock();
  21.         ++bombcount;
  22.         mtx_bc.unlock();
  23.      
  24.         mtx_stdout.lock();
  25.         cout << "Bomb set...bombcount = " << bombcount << '\n';
  26.         mtx_stdout.unlock();

  27.         thread (time,ref(*this)).detach();
  28.     }   
  29. }

  30. void Bomber::bomb_print() {
  31.     mtx_bc.lock();
  32.     --bombcount;
  33.     mtx_bc.unlock();

  34.     mtx_stdout.lock();
  35.     // do some printing here...
  36.     cout << "BOOM! bombcount = " << bombcount << '\n';
  37.     mtx_stdout.unlock();
  38. }

  39. void Bomber::time(Bomber &b) {
  40.     this_thread::sleep_for(chrono::seconds(3));

  41.     b.bomb_print();
  42. }

  43. int main() {
  44.     Bomber b;
  45.     b.boom();

  46.     for(;;) {} // infinite loop
  47. }
複製代碼
1. thread 可以丟進一個 static member function,如我的例子。另外,你可以用 std::ref 把自身物件包起來傳進 thread 和 static member function 之內,這樣就可以在內部使用物件的成員。

2. join() 是母 thread 要等子 thread 才需要呼叫,意思是暫停一切動作,等待子 thread 完成。因為放下炸彈後,你應該還可以走來走去,所以母 thread 不需要等子 thread,直接呼叫 detach() 切斷關係,讓子 thread 獨立運作,完成自己釋放資源。

建議加上 mutex 的使用。你的 bombcount 會被多個 thread 存取,所以最好存取前保護起來。另外標準輸出裝置(螢幕的 console 畫面)也最好用全域的 mutex 保護起來。

先這樣,有問題再說。

附帶一題 thread 是 c++11 的功能,其他版友如果要編譯需要用 VS 2012 以後的,或者其他比較新的編譯器。
...
瀏覽完整內容,請先 註冊登入會員
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部