發信人yoco.bbs@bbs.wretch.cc (眠月..),
看板Programming
標 題Win32 waiting/thread 一個奇怪的問題
發信站無名小站 (Mon Jul 24 04:35:51 2006)
轉信站ptt!ctu-reader!ctu-gate!ctu-peer!news.nctu!netnews.csie.nctu!wretch
問題簡化以後如下:
============================================================
有個對話視窗程式, 有
[Start],
[Hello] 兩個按鍵
[Start] 這個按鈕會去呼叫一個 DLL Api,
而這個Api會等很~久之後才會return
(這個 DLL 是廠商提供的,我不清楚他內部怎麼實作)
OnButtonStart()
{
result =
SomeApiInDLL();
// 這行會等很久才return
// 是在等一個硬體的sensor反應
if (result)
MessageBox("TRUE");
else
MessageBox("FALSE");
}
[Hello] 就是跳個 MessageBox 秀 Hello World !
OnButtonHello()
{
MessageBox("Hello World");
}
問題! 這個
SomeApiInDLL() 就是很久很久後才會 return 值,
可是! 在等待 SomeApiInDLL return 的過程當中
[Hello] 這個按鈕卻
“可以按”!!!
完全不會被卡住
<o>
照我過去的經驗,如果 message process 不 return, hang 在那邊
應該整個應用程式都會沒有回應的在那邊等,
但是這個 DLL 的函數卻可以在不 return 的狀態下,
讓我的程式可以繼續回應其他的 message。
這個包含 SomeApiInDLL() 的 DLL 是路上撿來的 XD
沒有 SourceCode 可看, 它到底是怎麼做到不會讓最上層 AP 卡在哪裡,
而 AP 也真的乖乖地在它的 SomeApiInDLL() 做完之後才乖乖地秀出
TRUE 或 FALSE 的 MessageBox...
這... 怎麼辦到的!?
我想了很久還是想不到。
請教前輩 <(_ _)>
--
To iterate is human, to recurse is divine.
遞迴只應天上有, 凡人該當用迴圈. L. Peter Deutsch
--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以t9562614.HUNG.ab.nthu.edu.tw海
推 nosrep:雖然不太清楚MFC.但底層有可能釋放執行權給 210.202.1.253 07/24 15:10
→ nosrep:上層使用..也許就是要防止上層AP卡住 210.202.1.253 07/24 15:11
→ nosrep:不過這是廢話啦..XD..只是說可以找找API 210.202.1.253 07/24 15:11