作者clarkman (涼雨)
看板C_and_CPP
標題[問題] overlap
時間Mon Nov 29 00:44:36 2010
Win在Overlap上有一些做法,想請教與討論
1. 通常會看到 Writefile或是ReadFile,參數放overlap
Result = WaitForSigleObect()
switch(Result)
{
Timeout:
.
.
Object:
}
不過我前主管當初帶我的時候,是教我另一個方法
2. 有一個大的Timer在管理接收與傳送
WriteFile方面通常會放overlap,因為寫入不會影響流程
Timer
{
ClearCommError(&constat)
if( constat.cbInQue ) //RS232的話
{
//不放overlap,確保資料有收完才往下跑
while( ReadFile(NULL) )
{
流程
}
}
...
//寫入不會影響流程,並且在下一次Timer啟動前已寫入
WriteFile(overlap)
}
===============================================================
我因為受到主管的影響,偏好愛用第二種作法,因為可以收完資料
後再跑流程,送出要送的資料。而因為有Timer,就可以一直接收,
不需要做有些人會做的 While( wait...),不過要寫好Time Out機制
我是想問這兩種作法大家有什麼意見?因為使用第二種方法還滿穩定
的,比較不會遇到以下的作法:
//通常滿常看人要Call API這樣做,譬如開裝置或送Command
if(SendData() == false)
{
Sleep(xx)
if(SandData() == flase)
}
第二種只要資料沒傳出去,Timer就會一直送,成功才跳到下一個流程,
或是TimeOut,但是這種的缺點就是很沒有彈性,因為資料是送過去,但
不能馬上讀到。而且不像第一種可以在更上層直接呼叫傳送接收,上層
等於是直線式的使用,可以if( Send()==flase)然後就如何處理,對於上
層修改流程很簡單,而第二種就很麻煩,因為丟出去後,不會立即回傳,
所以上層無法立即得知結果
另外可以請問有人知道USB有類似cbInQue的東西嗎?不然都得一直使用ReadFile
,感覺很花時間....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.138.161.236
→ stupid0319:用ReadFileEx放CallBack如何 11/29 00:49
→ clarkman:剛去查了一下,我還真的第一次看過放Callback,謝啦, 11/29 00:55
→ clarkman:長了知識!!! 11/29 00:55