(**:
windows系統程式設計之非同步i/o和完成埠
**:dword nreadbyte ;byte bbuf[buf_size] ;
readfile ( hfile, bbuf, sizeof(bbuf), &nreadbyte, &ov ) ;
// 由於此時hevent=null,所以同步物件為hfile,下面兩句的效果一樣
waitforsingleobject ( hfile, infinite ) ;
**:dword nreadbyte ;byte bbuf1[buf_size],bbuf2[buf_size],bbuf3[buf_size] ;
readfile ( hfile, bbuf1, sizeof(bbuf1), &nreadbyte, &ov1 ) ;
readfile ( hfile, bbuf2, sizeof(bbuf2), &nreadbyte, &ov2 ) ;
readfile ( hfile, bbuf3, sizeof(bbuf3), &nreadbyte, &ov3 ) ;
//假設三個i/o處理的時間比較長,到這裡還沒有結束
**:dword nreadbyte ;byte bbuf1[buf_size],bbuf2[buf_size],bbuf3[buf_size] ;
handle hevent1 = createevent ( null, false, false, null ) ;
handle hevent2 = createevent ( null, false, false, null ) ;
handle hevent3 = createevent ( null, false, false, null ) ;
readfile ( hfile, bbuf1, sizeof(bbuf1), &nreadbyte, &ov1 ) ;
readfile ( hfile, bbuf2, sizeof(bbuf2), &nreadbyte, &ov2 ) ;
readfile ( hfile, bbuf3, sizeof(bbuf3), &nreadbyte, &ov3 ) ;
//此時3個i/o操作的同步物件分別為hevent1,hevent2,hevent3
執行後的效果如下(winxp+sp2+vc6.0):**:void ccompletionroutinedlg::ontest()deletefile ( "a.txt" ) ;
deletefile ( "b.txt" ) ;
deletefile ( "c.txt" ) ;
}
4、 心得體會
每當乙個io操作結束時會產生乙個完成資訊,如果該io操作有完成例程的話就新增到完成例程佇列。一旦呼叫執行緒進入可變等待狀態,就會依次執行佇列中的完成例程。
在這個示例中還有乙個問題,如果把這個軟體放在系統分割槽的檔案目錄下可以正常執行,而放在其他碟符下就會出現問題,執行結果就不同,真是奇怪了。
四、使用完成埠(iocp)
例項二、使用iocp的非同步i/o示例
1、設計目標
體會完成埠的非同步i/o實現原理及過程。
2、 問題的分析與設計
說明:每個客戶端與乙個管道進行互動,而在互動過程中i/o操作結束後產生的完成包就會進入「i/o完成包佇列」。完成埠的執行緒佇列中的執行緒使用getqueuedcompletionstatus來檢測「i/o完成包佇列」中是否有完成包資訊。
3、詳細設計(關鍵**如下,具體見附件中的原始碼)
**:uint serverthread ( lpvoid lpparameter )return 0 ;
}void cmydlg::onstart()
// 建立執行緒
for ( i = 0; i
……}void cmydlg::onstop()
for ( i = 0; i ……}
Windows系統程式設計之非同步I O和完成埠
標 題 windows系統程式設計之非同步i o和完成埠 作 者 北極星2003 時 間 2006 07 02 18 46 鏈 接 詳細資訊 windows系統程式設計之非同步i o和完成埠 dword nreadbyte byte bbuf buf size readfile hfile,bbuf...
Windows系統程式設計之非同步I O和完成埠
tag iocp 完成埠completion port 一 同步i o和非同步i o dword nreadbyte byte bbuf buf size readfile hfile,bbuf,sizeof bbuf nreadbyte,ov 由於此時hevent null,所以同步物件為hfil...
系統程式設計之檔案系統程式設計
系統呼叫 所有的作業系統都提供多種服務的入口點,程式由此向核心請求服務。這些可直接進入核心的入口點被稱為系統呼叫。不同作業系統提供了自己的一套系統呼叫,所以系統呼叫無法實現跨平台使用。而且頻繁地系統呼叫,在使用者態和核心態之間切換,很耗費資源,效率不高。c標準庫提供了操作檔案的標準i o函式庫,與系...