程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 實現程序互斥運行的幾種方法

實現程序互斥運行的幾種方法

編輯:關於VC++

在WIN32下,實現程序互斥運行的方法有很多種,我簡單分析以下幾種不同的實現:

一、在VC下的實現

Visual C++ 是WIN32編程最主要也是最強大的編程工具這一,引用一名話來說VC就是“只有你想不到的,沒有VC做不到的”。廢話少說,下面看看用VC是如何這個功能。

A.使用編譯器來實現(使用MFC框架):

在.cpp文件開頭加上以下幾行: #pragma data_seg("Shared")
int volatile g_lAppInstance =0;
#pragma data_seg()

我們來看一下上面的內容:

第一句 #pragma data_seg("Shared") 創建一個稱為Shared 的新節。

第二句 int volatile g_lAppInstance =0 將 g_lAppInstance 放入Shared節中。注意此時只有將g_lAppInstance初始化,編譯器才會將其放入Shared節中,否則,將放入Shared以外的節。(實際上Visual C++ 編譯器提供了一個allocate 說明符,使我們可以將數據放到任何節中。)

第三句指示編譯器Shared 節結束。 #pragma comment(linker,"/section:Shared,RWS")這一句,我們使編譯鏈接器知道我們的Shared節具有讀,寫,共享的屬性。這是我們實現互斥運行的關鍵。這樣我們就可以在應用程序之間的多個實例之間共享g_lAppInstance 變量。

在InitInstance() 函數中加入: if(++g_lAppInstance>1)
{
  AfxMessageBox("程序已經運行!");
  return FALSE;
}
以上代碼的作用是在程序是開始對g_lAppInstancd 加1 ,如果發現其值大於1,那麼顯示Message Box ,並返回FALSE。(注意:在MFC中如果InitInstance返回FALSE,程序將不會被運行!)

B.使用命名互斥對象:

使用API函數CreateMutex來創建命名互斥對象來實現程序互斥是一個比較通用的方法,我們可以在IninInstance()函數加入如下代碼: HANDLE hObject = CreateMutex(NULL,FALSE,"LJPXYXC");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
  CloseHandle(hObject);
  AfxMessageBox("程序已經運行!");
  return FALSE;
}
以上的CreateMutext函數創建一個稱為“LJPXYXC”的命名的互斥對象,當程序的第二個實例運例時,調用CreateMutex 返回ERROR_ALREADY_EXISTS。我們根據這個值來實現程序的互斥運行。

二、VB的實現

在VB實現的程序中,全局對象App.PreInstance可以實現這個功能。App.PreInstance 是一個boolean型的值。如果其值為True說明程序已有一個實例在運行,如果為False那麼,程序可以運行。

我們可以在對窗體載入事件編程,來實現這個功能,代碼如下:Private sub Form1_load()
  If App.PreInstance = True then
    MsgBox “程序已經運行!”
    Unload me
  End if
End sub

三、Delphi,C++Builder 的實現

我沒有發現Delphi 和C++Builder 的編譯器有實現像VC一樣的功能。所以我們可以調用CreateMutex來實現這個功能。

CreateMutext(),GetLastError()這兩個函數的詳細信息可以參考MSDN.

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved