?? 4-1.cpp
字號:
// fileobj項目
# include <windows.h>
# include <iostream>
// 要使用的文件名
static LPCTSTR g_szFileName = "w2kdg.Fileobj.file.data.txt" ;
// 在數據文件中讀取當前數據的簡單線程時將傳遞來的該數據增加,并寫回數據文件中
static DWORD WINAPI ThreadProc (LPVOID lpParam)
{
// 將參數翻譯為長整數
LONG nAdd = reinterpret_cast <LONG> (lpParam) ;
// 建立完全的指定文件名
TCHAR szFullName [MAX_PATH] ;
:: GetTempPath(MAX_PATH, szFullName) ;
:: strcat(szFullName, g_szFileName) ;
// 打開文件對象
HANDLE hFile = :: CreateFile(
szFullName, // 文件的完全名稱
GENERIC_READ | GENERIC_WRITE, // 具有所有的訪問權
FILE_SHARE_READ, // 允許其他線程讀取
NULL, // 缺省的安全性
OPEN_ALWAYS, // 創建或打開文件
FILE_ATTRIBUTE_NORMAL, // 普通文件
NULL) ; // 無模板文件
if (hFile != INVALID_HANDLE_VALUE)
{
// 讀取當前數據
LONG nValue(0) ;
DWORD dwXfer(0) ;
:: ReadFile(
hFile, // 要讀取的文件
reinterpret_cast <LPVOID> (&nValue) , // 緩沖區
sizeof(nValue) , // 緩沖區容量
&dwXfer, // 讀取的字節數
NULL) ; // 無重疊I/O
if (dwXfer == sizeof(nValue) )
{
// 顯示當前數據
std :: cout << "read: " << nValue << std :: endl;
}
// 增加數值
nValue += nAdd;
// 寫回永久存儲介質
:: SetFilePointer(hFile, 0, NULL, FILE_BEGIN) ;
:: WriteFile(
hFile, // 要寫入的文件
reinterpret_cast <LPCVOID> (&nValue) , // 數據
sizeof(nValue), // 緩沖區容量
&dwXfer, // 寫入的字節數
NULL) ; // 無重疊I/O
if (dwXfer == sizeof(nValue) )
{
std :: cout << "write: " << nValue << std :: endl;
}
// 清除文件
:: CloseHandle(hFile) ;
hFile = INVALID_HANDLE_VALUE;
}
return(0) ;
}
void main()
{
// 創建100個線程從文件中進行讀寫
for (int nTotal = 100; nTotal > 0; --nTotal)
{
// 啟動線程
HANDLE hThread = :: CreateThread(
NULL, // 缺省的安全性
0, // 缺省的堆棧
ThreadProc, // 線程函數
reinterpret_cast <LPVOID> (1) , // 增量
0, // 無特殊的創建標志
NULL) ; // 忽略線程id
// 等待線程完成
:: WaitForSingleObject(hThread, INFINITE) ;
// 釋放指向線程的句柄
:: CloseHandle(hThread) ;
hThread = INVALID_HANDLE_VALUE;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -