看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Windows 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VC 2015 各位版友大家好,小弟我最近有個問題想要請教。 事情是這樣的。 小弟我目前在工作上遇到一個情況 用一個人家廠商提供的API int dosomething(參數不重要); 使用這個API時,如果是成功的話,他會直接卡在這個function直到連線中斷或是下中斷。 這樣會讓我在程式中,無法繼續做其他的事情。 失敗的話,會立刻回傳一個int 的error code訊息來告訴你。 這很明顯的就是要用一個thread去做處理。 於是小弟我就使用了一個std::thread接這個function 然後再做detach 但是我發現假設失敗的話無法拿到正確的error code你必須將error code寫在參數中 可是介面是寫死的無法動 所以小弟我現在的解法是這樣 用一個future auto f = async(std::launch::async, dosomething, 參數...); 然後 atuo status = f.wait_for(100ms); //代表他馬上拋出錯誤訊息 if(status != std::future_status::timeout) { return f.get(); } 以上使用async的解法是否恰當?? 是否有其他更好的做法?? 謝謝 -- 法老就預備他的車輛,帶領軍兵同去。埃及人追趕他們,法老一切的戰車就在他們安營 的地方追上了。他們對摩西說:你把我們帶來死在曠野嗎?你為甚麼這樣待我們,將我 們從埃及領出來呢?摩西向天空伸出無線電天線呼叫空中打擊,耶和華便用以色列空軍 F-16攜帶近接空中支援彈藥出擊。呼嘯而過的戰機在一小時內癱瘓了法老的戰車,連一 個也沒有賸下。以色列人看見埃及人的死屍都在海邊了。就敬畏耶和華、又信服他和他 的僕人摩西 。 《舊約聖經‧出埃及記‧14章》 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.219.147 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1486390827.A.ADF.html
phishingphi: 剛好看到 Item 36 的人路過... 02/07 00:21
Caesar08: 有甚麼不滿的嗎? 02/07 00:22
phishingphi: 不過寫死100ms這樣不就沒什麼彈性,你確定 runtime 02/07 00:25
phishingphi: 系統 loading 一變化或如何這段code還符合你的預期嗎 02/07 00:28
phishingphi: 我也是剛接觸 Concurrency API 的新手,只是剛看有這 02/07 00:29
phishingphi: 樣的疑問而已... 02/07 00:29
ilikekotomi: 如果失敗的話有需要做什麼處理嗎? 可以用callback 02/07 01:37
ilikekotomi: 比方說DoSomethingWrapper(原本參數...,Callback) 02/07 01:40
ilikekotomi: 實作為error = DoSomeThing(參數); callback(error); 02/07 01:41
我覺得Callback好像也行不通?? 因為Dosomething那邊如果成功就會卡在那行了 這樣Callback是否能夠運作呢??
ilikekotomi: 如果有事情是確定成功才能做的 這樣我只想得到wait 02/07 01:50
uranusjr: 寫一個 wrapper 在有錯誤時拋 exception 這樣可行嗎 02/07 02:02
uranusjr: 仔細想想好像也不用, 把 error code 存在某個地方就好 02/07 02:04
Clangpp: to uranusjr大 effective modern c++ item 36好像有說 02/07 09:34
Clangpp: thread 無法接到你拋的exception不過我不知道你的wrapper 02/07 09:35
Clangpp: 要怎樣設計就是了 02/07 09:35
Caesar08: 用current_exception與rethrow_exception 02/07 09:52
Caesar08: 就可以跨thread傳exception 02/07 09:53
這個方案我擔心會不會問題也出在成功時直接卡在DoSomething那邊 所以基本上所有的問題應該都是出在廠商本身的API上... ※ 編輯: Clangpp (59.124.167.226), 02/07/2017 11:25:55
ilikekotomi: 我原本想說callback是有錯才要處理的 02/07 20:34
ilikekotomi: 如果沒回傳錯誤沒進callback似乎也沒關係 02/07 20:34
ilikekotomi: 但關鍵就在成功的話有沒有需要執行什麼程式 02/07 20:35
TeaEEE: 非同步func用parallel_invoke應該相對簡單 02/08 14:43
Schottky: 推簽名檔 02/08 21:26