Mutex

  二重起動の禁止



ミューテックスとは、Win32のカーネルオブジェクトの1つで、複数のスレッドが共有リソースに同時にアクセスする場合に、1つのスレッドのみがアクセスできるようにして、スレッドを同期化するための機能です

最も簡単な利用方法は、任意のプログラムの二重起動を禁止する事です

  
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
	HANDLE hMutex;
	hMutex = CreateMutex(
		NULL,
		true,
		"NoMulti"
	);
	if ( hMutex == NULL ) {
		MessageBox( NULL, "ミューテックスの作成に失敗しました", "確認", MB_OK );
		return 0;
	}
	DWORD nRet;
	nRet = GetLastError();
	if ( nRet == ERROR_ALREADY_EXISTS ) {
		MessageBox( NULL, "二重起動を禁止します", "確認", MB_OK );
		return 0;
	}
  



  同時実行の排他制御



  
Set WshShell = CreateObject("WScript.Shell")

WshShell.Run( "Mutex.exe" )
WshShell.Run( "Mutex.exe" )
  

以下のコードでは同時に圧縮が処理されて、ken_all2.lzh が作成されません

Mutex.cpp
  
#include "stdafx.h"
#include "resource.h"
#include <lightbox.h>

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;					// 現在のインスタンス
TCHAR szTitle[MAX_LOADSTRING];				// タイトル バー テキスト
TCHAR szWindowClass[MAX_LOADSTRING];			// タイトル バー テキスト

// このコード モジュールに含まれる関数の前宣言:
ATOM			MyRegisterClass( HINSTANCE hInstance );
BOOL			InitInstance( HINSTANCE, int );
LRESULT CALLBACK	WndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK	About( HWND, UINT, WPARAM, LPARAM );

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{

	LboxUnlha Unlha;
	LboxFileSystem Fs;

	if ( Fs.Exist( "C:\\TEMP\\ken_all\\ken_all.lzh" ) ) {
		Unlha.TargetPath.operator = ("C:\\TEMP\\ken_all\\ken_all2.lzh");
	}
	else {
		Unlha.TargetPath.operator = ("C:\\TEMP\\ken_all\\ken_all.lzh");
	}
	Unlha.Freeze("C:\\TEMP\\ken_all\\ken_all.csv");

	return 0;
}
  

ken_all.csv は、ここから 全国一括をダウンロードして解凍したものです

以下のコードでは順次に圧縮が処理されて、ken_all2.lzh が作成されます

  
#include "stdafx.h"
#include "resource.h"
#include <lightbox.h>

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;					// 現在のインスタンス
TCHAR szTitle[MAX_LOADSTRING];				// タイトル バー テキスト
TCHAR szWindowClass[MAX_LOADSTRING];			// タイトル バー テキスト

// このコード モジュールに含まれる関数の前宣言:
ATOM			MyRegisterClass( HINSTANCE hInstance );
BOOL			InitInstance( HINSTANCE, int );
LRESULT CALLBACK	WndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK	About( HWND, UINT, WPARAM, LPARAM );

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{

	HANDLE hMutex;
	CreateMutex(
		NULL,
		false,
		"MyMutex"
	);

	hMutex = OpenMutex( SYNCHRONIZE, false, "MyMutex" );
	if ( hMutex == NULL ) {
		return 0;
	}

	WaitForSingleObject( hMutex, INFINITE );

	LboxUnlha Unlha;
	LboxFileSystem Fs;

	if ( Fs.Exist( "C:\\TEMP\\ken_all\\ken_all.lzh" ) ) {
		Unlha.TargetPath.operator = ("C:\\TEMP\\ken_all\\ken_all2.lzh");
	}
	else {
		Unlha.TargetPath.operator = ("C:\\TEMP\\ken_all\\ken_all.lzh");
	}
	Unlha.Freeze("C:\\TEMP\\ken_all\\ken_all.csv");

	ReleaseMutex( hMutex );

	return 0;
}
  



  MutexTrio

Creator
  
case WM_CREATE:
	SetWindowText( hWnd, "Creator" );
	CreateMutex( NULL, false, "MutexTrio" );
	break;
  

Locker
  
case WM_CREATE:
	SetWindowText( hWnd, "Locker" );
	hMutex = OpenMutex( SYNCHRONIZE, false, "MutexTrio" );
	if ( hMutex == NULL ) {
		MessageBox( hWnd, "ミューテックスは存在しません", "", MB_OK );
		return -1;
	}
	WaitForSingleObject( hMutex, INFINITE );
	break;
  

Operator
  
case WM_CREATE:
	SetWindowText( hWnd, "Operator" );
	hMutex = OpenMutex( SYNCHRONIZE, false, "MutexTrio" );
	if ( hMutex == NULL ) {
		MessageBox( hWnd, "ミューテックスは存在しません", "", MB_OK );
		return -1;
	}
	WaitForSingleObject( hMutex, INFINITE );
	MessageBox( hWnd, "所有権を取得しました", "", MB_OK );
	ReleaseMutex( hMutex );
	break;
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ