Windows系統程式設計之非同步I O和完成埠

2022-04-01 15:42:01 字數 2347 閱讀 4973

(**:

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

**:
void ccompletionroutinedlg::ontest() 

deletefile ( "a.txt" ) ;

deletefile ( "b.txt" ) ;

deletefile ( "c.txt" ) ;

}

執行後的效果如下(winxp+sp2+vc6.0):

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函式庫,與系...