以前作成した 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 に与えている名称がうまくなかった.’\’ が使えない.
パスの区切りを ‘/’ に変更してうまくいった.
次の様なコードをアプリケーションクラスの 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 ;
}
}
}
[…] 2021/12/01 W_mutex を利用した単体テスト用コード […]