Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //----------------------------------------------------------------
- // 同一スレッド内でのみ、データを受け渡しするための関数群
- // ・OnStartThreadからOnDoneThreadまでが同一スレッド内です
- // ・irvine.exeのフォルダにデータ保存用のINIファイルが作られます
- // ・Dorothy2には依存しないのでDorothy2以外の場所でも動作します
- //----------------------------------------------------------------
- //-------------------------------------------
- // スレッド毎のデータを書き込む
- // key : 任意のキー。INIのキーに相当する
- // data : 文字列データ。※ 必要に応じてエスケープするなど、INIが扱える形式にしておくこと!
- function saveThreadData( key, data ) {
- var dll = new DynaCall;
- dll.register('kernel32.dll', 'GetModuleFileNameA', 'f=s', 'i=hsu', 'r=u');
- dll.register('kernel32.dll', 'GetCurrentProcessId', 'f=s', 'r=u');
- dll.register('kernel32.dll', 'GetCurrentThreadId', 'f=s', 'r=u');
- dll.register('kernel32.dll', 'OpenThread', 'f=s', 'i=ubu', 'r=h');
- dll.register('kernel32.dll', 'GetExitCodeThread', 'f=s', 'i=hs', 'r=b');
- dll.register('kernel32.dll', 'CloseHandle', 'f=s', 'i=h', 'r=l');
- var THREAD_QUERY_INFORMATION = 0x40;
- var STILL_ACTIVE = 0x103;
- //IrvineのフォルダPATHを得る
- function getIrvineFolder() {
- var buf = new StringBuffer(260, 0);
- var len = dll.GetModuleFileNameA(null, buf, buf.length);
- return buf.slice(0, len).toString().replace(/[^\\]+$/, '');
- }
- //指定スレッドが生存中か否かを返す
- function isAlive( thread_id ) {
- var handle = dll.OpenThread(THREAD_QUERY_INFORMATION, false, thread_id);
- if (!handle) {
- return false;
- }
- var exit_code = new Struct('v:u');
- var r = dll.GetExitCodeThread(handle, exit_code);
- dll.CloseHandle(handle);
- return r && exit_code.v == STILL_ACTIVE;
- }
- var cur_pid = dll.GetCurrentProcessId().toString();
- var cur_tid = dll.GetCurrentThreadId().toString();
- var ini_path = getIrvineFolder() + 'thread_data.ini';
- var mutex = new Mutex(ini_path);
- try {
- mutex.lock();
- var ini = new Ini(ini_path);
- //既存セクションから不要なものを削除する
- var sections = ini.readSections();
- for (var i in sections) {
- var pid = sections[i].split('_')[0];
- var tid = sections[i].split('_')[1];
- if (pid != cur_pid || isAlive(parseInt(tid)) == false) {
- ini.eraseSection(sections[i]);
- }
- }
- //書き込み
- ini.write(cur_pid + '_' + cur_tid, key, data);
- ini.update();
- } finally {
- mutex.unlock();
- }
- }
- //-------------------------------------------
- // スレッド毎のデータを読み込む
- // key : キー。INIのキーに相当する
- // default_value : キー不在のときの戻り値 (省略可能。省略時はundefined)
- // 戻り値 : 読み込んだデータ。または、キーが不在のときdefault_value。
- function loadThreadData( key, default_value ) {
- var dll = new DynaCall;
- dll.register('kernel32.dll', 'GetModuleFileNameA', 'f=s', 'i=hsu', 'r=u');
- dll.register('kernel32.dll', 'GetCurrentProcessId', 'f=s', 'r=u');
- dll.register('kernel32.dll', 'GetCurrentThreadId', 'f=s', 'r=u');
- //IrvineのフォルダPATHを得る
- function getIrvineFolder() {
- var buf = new StringBuffer(260, 0);
- var len = dll.GetModuleFileNameA(null, buf, buf.length);
- return buf.slice(0, len).toString().replace(/[^\\]+$/, '');
- }
- var cur_pid = dll.GetCurrentProcessId().toString();
- var cur_tid = dll.GetCurrentThreadId().toString();
- var ini_path = getIrvineFolder() + 'thread_data.ini';
- var mutex = new Mutex(ini_path);
- try {
- mutex.lock();
- var ini = new Ini(ini_path);
- var data = ini.read(cur_pid + '_' + cur_tid, key, default_value);
- } finally {
- mutex.unlock();
- }
- return data;
- }
- /*------------------------
- 使い方
- //書き込み側
- saveThreadData('hoge', '12345');
- saveThreadData('fuga', 'abcdef');
- //読み込み側
- var hoge = loadThreadData('hoge', '無し');
- println('hoge--->' + hoge);
- var fuga = loadThreadData('fuga');
- if (isUndefined(fuga)) {
- println('fugaは無い');
- } else {
- println('fuga--->' + fuga);
- }
- ------------------------*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement