Advertisement
Guest User

Untitled

a guest
Sep 3rd, 2014
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     //----------------------------------------------------------------
  2.     // 同一スレッド内でのみ、データを受け渡しするための関数群
  3.     //  ・OnStartThreadからOnDoneThreadまでが同一スレッド内です
  4.     //  ・irvine.exeのフォルダにデータ保存用のINIファイルが作られます
  5.     //  ・Dorothy2には依存しないのでDorothy2以外の場所でも動作します
  6.     //----------------------------------------------------------------
  7.    
  8.    
  9.     //-------------------------------------------
  10.     // スレッド毎のデータを書き込む
  11.     //    key :  任意のキー。INIのキーに相当する
  12.     //    data :  文字列データ。※ 必要に応じてエスケープするなど、INIが扱える形式にしておくこと!
  13.     function saveThreadData( key, data ) {
  14.         var dll = new DynaCall;
  15.         dll.register('kernel32.dll', 'GetModuleFileNameA', 'f=s', 'i=hsu', 'r=u');
  16.         dll.register('kernel32.dll', 'GetCurrentProcessId', 'f=s', 'r=u');
  17.         dll.register('kernel32.dll', 'GetCurrentThreadId', 'f=s', 'r=u');
  18.         dll.register('kernel32.dll', 'OpenThread', 'f=s', 'i=ubu', 'r=h');
  19.         dll.register('kernel32.dll', 'GetExitCodeThread', 'f=s', 'i=hs', 'r=b');
  20.         dll.register('kernel32.dll', 'CloseHandle', 'f=s', 'i=h', 'r=l');
  21.         var THREAD_QUERY_INFORMATION = 0x40;
  22.         var STILL_ACTIVE = 0x103;
  23.        
  24.         //IrvineのフォルダPATHを得る
  25.         function getIrvineFolder() {
  26.             var buf = new StringBuffer(260, 0);
  27.             var len = dll.GetModuleFileNameA(null, buf, buf.length);
  28.             return buf.slice(0, len).toString().replace(/[^\\]+$/, '');
  29.         }
  30.        
  31.         //指定スレッドが生存中か否かを返す
  32.         function isAlive( thread_id ) {
  33.             var handle = dll.OpenThread(THREAD_QUERY_INFORMATION, false, thread_id);
  34.             if (!handle) {
  35.                 return false;
  36.             }
  37.             var exit_code = new Struct('v:u');
  38.             var r = dll.GetExitCodeThread(handle, exit_code);
  39.             dll.CloseHandle(handle);
  40.             return r  &&  exit_code.v == STILL_ACTIVE;
  41.         }
  42.        
  43.         var cur_pid = dll.GetCurrentProcessId().toString();
  44.         var cur_tid = dll.GetCurrentThreadId().toString();
  45.        
  46.         var ini_path = getIrvineFolder() + 'thread_data.ini';
  47.         var mutex = new Mutex(ini_path);
  48.         try {
  49.             mutex.lock();
  50.             var ini = new Ini(ini_path);
  51.             //既存セクションから不要なものを削除する
  52.             var sections = ini.readSections();
  53.             for (var i in sections) {
  54.                 var pid = sections[i].split('_')[0];
  55.                 var tid = sections[i].split('_')[1];
  56.                 if (pid != cur_pid  ||  isAlive(parseInt(tid)) == false) {
  57.                     ini.eraseSection(sections[i]);
  58.                 }
  59.             }
  60.             //書き込み
  61.             ini.write(cur_pid + '_' + cur_tid, key, data);
  62.             ini.update();
  63.         } finally {
  64.             mutex.unlock();
  65.         }
  66.     }
  67.    
  68.    
  69.     //-------------------------------------------
  70.     // スレッド毎のデータを読み込む
  71.     //    key :  キー。INIのキーに相当する
  72.     //    default_value :  キー不在のときの戻り値 (省略可能。省略時はundefined)
  73.     //    戻り値 :  読み込んだデータ。または、キーが不在のときdefault_value。
  74.     function loadThreadData( key, default_value ) {
  75.         var dll = new DynaCall;
  76.         dll.register('kernel32.dll', 'GetModuleFileNameA', 'f=s', 'i=hsu', 'r=u');
  77.         dll.register('kernel32.dll', 'GetCurrentProcessId', 'f=s', 'r=u');
  78.         dll.register('kernel32.dll', 'GetCurrentThreadId', 'f=s', 'r=u');
  79.        
  80.         //IrvineのフォルダPATHを得る
  81.         function getIrvineFolder() {
  82.             var buf = new StringBuffer(260, 0);
  83.             var len = dll.GetModuleFileNameA(null, buf, buf.length);
  84.             return buf.slice(0, len).toString().replace(/[^\\]+$/, '');
  85.         }
  86.        
  87.         var cur_pid = dll.GetCurrentProcessId().toString();
  88.         var cur_tid = dll.GetCurrentThreadId().toString();
  89.        
  90.         var ini_path = getIrvineFolder() + 'thread_data.ini';
  91.         var mutex = new Mutex(ini_path);
  92.         try {
  93.             mutex.lock();
  94.             var ini = new Ini(ini_path);
  95.             var data = ini.read(cur_pid + '_' + cur_tid, key, default_value);
  96.         } finally {
  97.             mutex.unlock();
  98.         }
  99.         return data;
  100.     }
  101.    
  102.    
  103.     /*------------------------
  104.       使い方
  105.    
  106.    
  107.     //書き込み側
  108.     saveThreadData('hoge', '12345');
  109.     saveThreadData('fuga', 'abcdef');
  110.    
  111.    
  112.     //読み込み側
  113.     var hoge = loadThreadData('hoge', '無し');
  114.     println('hoge--->' + hoge);
  115.    
  116.     var fuga = loadThreadData('fuga');
  117.     if (isUndefined(fuga)) {
  118.         println('fugaは無い');
  119.     } else {
  120.         println('fuga--->' + fuga);
  121.     }
  122.    
  123.     ------------------------*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement