程序運行5份實例的實現

前幾天看到某君問到:如何在一臺機器上實現只能運行一個程序的10份實例?於是我思考了一下,寫出了實現代碼。程序的界面如下:

由於這個程序有無界面關係不大,所以就沒怎麼裝扮,也沒有把劉濤的照片加進來。
在以前就聽說了可以讓程序只運行一份實例,實現這個的方法還是比較多的,用得最普遍的可能就是Mutex。而現在的任務是可以運行10份實例,有朋友可能會說用Mutex會很容易完成,然而遺憾的是隻用Mutex真的很難實現,
(A:我要用互斥來實現這個任務。
 B:僅用互斥很難實現,它不適合你,放棄吧!
 A:非互斥不要)
嘿嘿....A君的癡情似乎不應該用在這裏,那麼花心的我應該如何實現呢?答案即將接曉,讓我們拭目以待!下面插播5分鐘的廣告,廣告後再繼續。
廣告中.....
好了廣告完了,廢話也完了,下面來說一下主題:
主要的方法就是在程序中加入共享節添加一個全標誌位,然後再作判斷就可以實現了。關於共享節並不想說太多,一句話:它是居家旅行,進程通信之必備良藥:

#include <windows.h>
#include "resource.h"
#include <stdio.h>
#pragma data_seg(".thinkSJ")/////添加一個新節並共享
DWORD gs_dCount = 0;
#pragma data_seg()
#pragma comment(linker,"/section:.thinkSJ,RWS")
LRESULT CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)
{
    ::DialogBoxParam (hInstance,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)DlgProc,NULL);
    return 1;
}
LRESULT CALLBACK DlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_INITDIALOG:
        gs_dCount += 1;    //////在初使化消息中對全局標誌位加1
        if(gs_dCount > 5)/////該程序只能運行5份實例
        {
            ::SendMessage (hWnd,WM_CLOSE,0,0);
        }
        return true;
    case WM_CLOSE:
        gs_dCount -= 1;//////在關閉消息中對全局標誌位減1
        ::EndDialog (hWnd,0);
        return true;
    }
    return false;

聲明:文中所涉及的人物(如:A君、B君)勻採用化名,請勿對號入座!
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章