VC++中實現程式互斥執行 (轉)
VC++中實現互斥執行
在的開發過程中,有時需要控制一些程式不能同時執行,也就是多個程式間互斥執行(還包括禁止同一程式執行多個例項)。針對這一問題,我們在Visual C++ 6.0中利用對映實現了多個程式間的互斥執行。
在講述具體的方法之前,讓我們先來看看和記憶體對映檔案操作有關的幾個重要的:
1)CreateFileMap函式為指定的檔案建立一個檔案對映,該函式的原型如下:
HANDLE CreateFileMapping(
HANDLE hFile, // 用於對映的檔案控制程式碼
LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 記憶體對映檔案的描述符
D flProtect, // 檔案的保護方式
DWORD dwMaximumSizeHigh,
// 檔案對映物件的最大長度的高32位
DWORD dwMaximumSizeLow,
// 最大長度的低32位
LPCTSTR lpName
// 指定這個記憶體對映檔案的名字
);
2)MapViewOfFile函式將檔案的檢視對映到一個程式的地址空間上,返回LPVOID型別的記憶體指標,透過它,就可以直接訪問檔案檢視中的資訊:
LPVOID MapViewOfFile(
HANDLE hFileMappingObjct,
// 對映檔案物件控制程式碼
DWORD dwDesiredAccess, // 訪問
DWORD dwFileOffsetHigh,
// 檔案偏移地址的高32位
DWORD dwFileOffsetLow,
// 檔案偏移地址的低32位
DWORD dwNumberOfBytesToMap
// 對映檢視的大小
);
在Visual C++ 6.0中我們用預設方式生成基於對話方塊的應用程式,在程式的初始化階段,在CwinApp派生類的InitInstance函式的開始處,新增以下程式碼:
{ HANDLE hMap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE—READWRITE, 0, 128, ″MutexRunning″);
if(hMap==NULL) // 如果建立失敗
{ AfxMessageBox(″建立用於互斥執行的記憶體對映檔案物件失敗!″,
MB—OK|MB—ICONSTOP);
return FALSE; }
else if(GetLastError()==ERROR—ALREADY—EXISTS)
{ LPVOID lpMem=MapViewOfFile(hMap, FILE_MAP—WRITE, 0,0,0);
CString str=(char?)lpMem;
UnmapViewOfFile(lpMem);
CloseHandle(hMap);
AfxMessageBox(str, MB—OK|MB—ICONSTOP);
return FALSE; }
else
{ LPVOID lpMem=MapViewOfFile(hMap, FILE—MAP—WRITE, 0,0,0);
strcpy((char?)lpMem, ″xxx程式正在執行!″);
UnmapViewOfFile(lpMem);
}
AfxEnableControlContainer();
......
這裡可以在InitInstance函式最後returnFALSE之前
CloseHandle(hMap);
關閉記憶體對映檔案物件控制程式碼
return FALSE;
}
以上的程式在Visual C++ 6.0中已透過。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004499/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 執行緒安全佇列(使用互斥鎖進行實現)執行緒佇列
- 執行緒同步與互斥:互斥鎖執行緒
- 執行緒的互斥鎖執行緒
- 實現TypeScript中的互斥型別TypeScript型別
- VC++執行庫安裝難題C++
- Linux之執行緒互斥鎖Linux執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- PHP 互斥鎖:如何確保程式碼的執行緒安全?PHP執行緒
- java基礎:執行緒與程式;執行緒的分工,協作,互斥;volatile關鍵字Java執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- 執行緒同步(windows平臺):互斥物件執行緒Windows物件
- Java中如何實現執行緒呢?Java執行緒
- Java中實現執行緒的方式Java執行緒
- C++11多執行緒程式設計(二)——互斥鎖mutex用法C++執行緒程式設計Mutex
- 實現手機直播原始碼中兩個執行緒依次執行的相關程式碼原始碼執行緒
- 執行緒池的實現程式碼分析執行緒
- Linux多執行緒的使用一:互斥鎖Linux執行緒
- 五、併發控制(1):執行緒的互斥執行緒
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- oracle中執行os命令(轉)Oracle
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- 透過互斥鎖+條件量的方式實現同步與互斥
- 執行緒安全: 互斥鎖和自旋鎖(10種)執行緒
- 互斥鎖mutex的簡單實現Mutex
- 圖解程式執行緒、互斥鎖與訊號量-看完不懂你來打我圖解執行緒
- Java併發程式設計,互斥同步和執行緒之間的協作Java程式設計執行緒
- 讓 Markdown 中的程式碼可以實時執行
- spring+groovy實現動態程式碼注入執行Spring
- PostgreSQL中利用驅動程式實現故障轉移SQL
- join、volatile、newSingleThreadLatch 實現執行緒順序執行thread執行緒
- 【Lua】實現程式碼執行覆蓋率統計工具
- 【PyQt5】PyQt5 多執行緒 QThread 實現(轉載)QT執行緒thread
- [PyQt5] PyQt5 多執行緒 QThread 實現(轉載)QT執行緒thread
- java執行緒實現方式Java執行緒
- 執行緒池的實現執行緒
- 如何實現多執行緒執行緒
- 在Docker中執行SpringBoot程式DockerSpring Boot
- Python 中執行緒和程式Python執行緒