當採用多個writefile函式非同步地給乙個檔案寫入資料時,會遇到後寫的資料對前面已寫資料的覆蓋問題,即使是採用setfilepointer這個函式來把檔案指標指向檔案末尾再追加,也會造成覆蓋的問題。
對乙個檔案已非同步方式進行操作時開啟檔案方式如下:
overlap4.hevent=createevent(null,false,false,null);
寫操作為
writefile( hdevice3,
pbuffer2,
len2, &dwwrite2,
&overlap4);
overlap4 是乙個結構體,它的乙個成員hevent用來控制讀寫的同步。但是當兩次呼叫寫函式 writefile時,第二次會造成第一次的覆蓋,當第一次寫完後設定檔案指標的位置到檔案末尾也無濟於事,setfilepointer( hdevice3, 0, null, file_end )。
最後才終於弄明白了這個問題,當進行非同步操作時,作業系統並不維護檔案指標的位置,這樣也是合理的,因為多個程序進行寫操作時應該需要多個檔案指標,所以作業系統乾脆自己不維護檔案指標(自己也維護不了這麼多的檔案指標),所以它直接讓每個寫執行緒儲存自己的檔案指標,也就是指示自己的寫操作寫到檔案的哪個位置了。
解決方案如下:
dwcurrentfileposition = setfilepointer( hdevice3, 0, null, file_end ); //獲取上次寫操作的偏移量
overlap4.offset=dwcurrentfileposition; //偏移量儲存到overlap結構體裡
writefile( hdevice3,
pbuffer2,
len2, &dwwrite2,
&overlap4);
這樣的話就ok了,因為這個是第二次寫,它把第一次寫後的檔案指標的偏移量儲存在 overlap4 的offset中,這樣第二次寫操作就從這個偏移量開始進行寫操作。
8 非同步操作
對於遊戲開發而言,經常使用到非同步相關操作,因此在使用moduleframework之前應該提供乙個非同步操作的類。以後相關的非同步操作均繼承這個類 asyncoperation 先貼出 ifndef async operation h define async operation h includ...
android非同步操作
1 要實現非同步操作就要用到android提供乙個asynctask類,這個類是乙個泛型。下面附上我的 我直接在 中說明 package com.example.async2 import android.os.asynctask import android.view.view import an...
Dart 非同步操作
dart 語言是目前少數幾個支援非同步操作的語言。一般使用async函式和await表示式實現非同步操作。dart 庫提供asynchronous的功能。該功能提供介面來進行耗費時間的操作,二呼叫的主 不用等待耗時操作執行完成後才進行操作。該功能返回future或stream物件。使用了async或...