::CreateMutex の名称

投稿日 by Iwao

以前作成した W_mutex を利用.
同じドキュメントを開かない様なガードに使えると思い,単体テスト用のコードを書いた.

#include	"messbar.hxx"
#include	"itls_tmp.hxx"
#include	"cmd_line.hxx"
#include	"S_Exec.hxx"
#include	"W_mutex.hxx"

tstring	make_mutex_name	(const tstring& doc_name)
{
	tstring		mutex_name ;
	v_tstring	argv = ::get_arg() ;
	if (argv.size() > 0) {
		mutex_name += argv[0] ;
		mutex_name += _T(" ") ;
		}
	mutex_name += doc_name ;
///////////////////////////////////////////////////////////////
//	mutex_name = ::Path_Normalize(mutex_name,_T('/')) ;
///////////////////////////////////////////////////////////////
	std::terr << mutex_name << std::endl ;
	return	mutex_name ;
	}

bool	t_wait	(const tstring& doc_name)
{
	tstring		mutex_n = ::make_mutex_name(doc_name) ;
	size_t		bar_max = 1000 ;
	MessageBar	bar(_T("wait"),bar_max) ;
	for (size_t index=0 ; index<bar_max ; index++) {
		::Sleep(100) ;
		W_mutex	mutex(mutex_n.c_str()) ;
		bar.SetBarInc() ;
		if (mutex.Is_exist()) {
			}
		else {
			break ;
			}
		}
	return	true ;
	}

bool	t_loop	(const tstring& doc_name)
{
	tstring		mutex_n = ::make_mutex_name(doc_name) ;
	W_mutex		mutex(mutex_n.c_str()) ;
	size_t		bar_max = 100 ;
	MessageBar	bar(_T("loop"),bar_max) ;
	for (size_t index=0 ; index<bar_max ; index++) {
		bar.SetBarInc() ;
		::Sleep(30) ;
		}
	::Sleep(2000) ;
	return	true ;
	}

bool	test	(const tstring& doc_name)
{
	::t_wait(doc_name) ;
	::t_loop(doc_name) ;
	return	true ;
	}

int	_tmain	(int argc,TCHAR* argv[])
{
	_tsetlocale(LC_ALL,_T("")) ;
	::reg_argv(argc,argv) ;
	if (argc > 1) {
		test(argv[1]) ;
		}
	else {
		time_t	now = ::time(NULL) ;
		size_t	count = 5 ;
		tstring	test_cmd ;
		S_Exec	se ;
		{
			tstring	exe_name ;
			tstring	tmp_name ;
			{
				exe_name = argv[0] ;
				}
			{
				tstring	temp_dir = ::Get_i_Tools_tmp() ;
				tstring	time_str = ::Now_Format(_T("%H%M%S")) ;
					tmp_name = ::Path_AddLastSP(temp_dir) + time_str + _T(".tmp") ;
				}
			{
				test_cmd = exe_name + _T(" ") + tmp_name ;
				}
			{
				se.SetFile      (exe_name.c_str()) ;
				se.SetParamaters(tmp_name.c_str()) ;
				}
			{
				for (size_t index=0 ; index<count ; index++) {
					std::terr << test_cmd << std::endl ;
					se.Execute() ;
					::Sleep(2000) ;
					}
				}
			{
				::Sleep(1000) ;
				tstring		mutex_n = ::make_mutex_name(tmp_name.c_str()) ;
				size_t		bar_max = 1000 ;
				MessageBar	bar(_T("test wait "),bar_max) ;
				for (size_t index=0 ; index<bar_max ; index++) {
					W_mutex	mutex(mutex_n.c_str()) ;
					if (mutex.Is_exist()) {
						bar.SetBarInc() ;
						::Sleep(100) ;
						}
					else {
						break ;
						}
					}
				}
			}
		}
	return	0 ;
	}

#include	"messbar.cxx"

Mutex の名称としては,exe 名とドキュメント名を連結したものとした.


最初,実行させるとうまく動作しない(Mutex オブジェクトが存在するはずなのに抜ける).
::CreateMutex に与えている名称がうまくなかった.’\’ が使えない.
パスの区切りを ‘/’ に変更してうまくいった.
CreateMutex の名称で '\' は使えない


次の様なコードをアプリケーションクラスの InitInstance に追加.

	{
		if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) {
			tstring	doc_name = cmdInfo.m_strFileName ;
			tstring	exe_name = ::Get_module_name() ;
			tstring	mtx_name = exe_name + _T(" ") + doc_name ;
				mtx_name = ::Path_Normalize(mtx_name,_T('/')) ;
			static	W_mutex	mutex(mtx_name.c_str()) ;
			if (mutex.Is_exist()) {
				return	FALSE ;
				}
			}
		}
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です