<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TitaniumDesktop &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/titaniumdesktop/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Thu, 07 Apr 2011 01:00:47 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>TitaniumDesktopの多重起動を抑制する（Windows）</title>
		<link>https://blog.mach3.jp/2011/04/07/titaniumdesktop%e3%81%ae%e5%a4%9a%e9%87%8d%e8%b5%b7%e5%8b%95%e3%82%92%e6%8a%91%e5%88%b6%e3%81%99%e3%82%8b%ef%bc%88windows%ef%bc%89.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 07 Apr 2011 01:00:47 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Titanium]]></category>
		<category><![CDATA[TitaniumDesktop]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1751</guid>

					<description><![CDATA[最近Titaniumを少々いじっておりましたが、軽くハマったのでメモなど。 Titanium Desktopで作ったアプリの多重起動を抑制してみる実験。 環境の都合などで、Windowsのみ。 概要 普通につくるといくら [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>最近<a href="http://www.appcelerator.com/">Titanium</a>を少々いじっておりましたが、軽くハマったのでメモなど。<br />
<a href="http://www.appcelerator.com/products/titanium-desktop-application-development/">Titanium Desktop</a>で作ったアプリの多重起動を抑制してみる実験。<br />
環境の都合などで、Windowsのみ。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/_JJkNs5Ixl70/TZyzIP00O4I/AAAAAAAABRE/rbUuNocuR_M/201104070334.png" alt="TitaniumDesktopの多重起動を抑制する（Windows）"/></figure>



<p></p>



<span id="more-1751"></span>



<h2 class="wp-block-heading">概要</h2>



<h3 class="wp-block-heading">普通につくるといくらでも立ち上がるよ！</h3>



<p>Titaniumで普通にデスクトップアプリを作ると、いくらでも立ち上げられます。<br />
連打すれば連打しただけアプリウィンドウがぽぽぽぽーんと増えていく。<br />
アプリの性格にもよりけりですが、不都合が生じる事の方が多そうです。</p>



<h3 class="wp-block-heading">ざっくりとした仕組み</h3>



<ol class="wp-block-list">
<li>タスクリストにある自分の名前の数を確認。</li>



<li>2個以上あったら多重起動されてしまっているので、自分を落とす。</li>
</ol>



<h2 class="wp-block-heading">ソース</h2>



<p>見ての通り、<em>Windows用の処理しか書いていません</em><br />
Mac/Linuxではcaseを書き足してやらねば動きませんのでご注意を。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> SingleLaunch = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> appName, callback </span>)</span>{
    <span class="hljs-keyword">var</span> name, args, prc;

    <span class="hljs-keyword">switch</span>( Titanium.platform ){
        <span class="hljs-keyword">case</span> <span class="hljs-string">"win32"</span> :
            name = appName + <span class="hljs-string">".exe"</span>;
            args = &#91; <span class="hljs-string">"tasklist"</span>, <span class="hljs-string">"/NH"</span>, <span class="hljs-string">"/FI"</span>, <span class="hljs-string">"IMAGENAME eq "</span> + name ];
            <span class="hljs-keyword">break</span>;
        <span class="hljs-keyword">default</span> :
            <span class="hljs-keyword">throw</span> <span class="hljs-string">"このプラットフォームはサポートされていません"</span>;
            <span class="hljs-keyword">break</span>;
    }
    prc = Titanium.Process.createProcess( args );
    prc.processCount = <span class="hljs-number">0</span>;
    prc.setOnRead(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        <span class="hljs-keyword">this</span>.processCount += e.data.toString().match( <span class="hljs-built_in">RegExp</span>( name, <span class="hljs-string">"g"</span> ) ).length;
    });
    prc.setOnExit(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">if</span>( <span class="hljs-keyword">this</span>.processCount &gt;= <span class="hljs-number">2</span> ){
            alert( appName + <span class="hljs-string">"は既に起動しています"</span> );
            Titanium.UI.currentWindow.close();
            <span class="hljs-keyword">return</span>;
        }
        callback();
    });
    prc.launch();
};

SingleLaunch( <span class="hljs-string">"YouApplication"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-comment">/* アプリを初期化 */</span>
});
</code></span></pre>


<p>タスクリストを取得するには、<em>Titanium.Process</em>を使って「<em>tasklist</em>」コマンドを呼びます。<br />
<em>createProcess</em>メソッドの引数に、コマンドとその引数を配列にして渡して<em>launch</em>。</p>



<p>cf) <a href="http://developer.appcelerator.com/apidoc/desktop/latest/Titanium.Process-module">Appcelerator Developer Center &#8211; API for Titanium.Process (version 1.1)</a></p>



<p><em>setOnRead</em>は出力が返される度に呼ばれるので、そこで自分の名前を探して数を加算。<br />
すべての出力が完了したら<em>setOnExit</em>が呼ばれるので、合計の数を見て条件分岐します。<br />
2個以上であれば自身を落とし、そうでなければcallbackを呼んでアプリの初期化を行いましょう。</p>



<h2 class="wp-block-heading">ポイント</h2>



<h3 class="wp-block-heading">tasklistが正しい値を返してくれない</h3>



<p>既に1個起動しているはずなのに自分の名前が見つからない。<br />
Titanium.Processで呼んだtasklistと、コマンドプロンプトで呼んだtasklistで結果が変わってしまう。</p>



<p>どうやら、TitaniumProcessがヘッダの行数を勘違いしている事に起因する模様。<br />
見出しを出力しない<em>/HN</em>オプションを付けることで解決出来ました。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">args = &#91; <span class="hljs-string">"tasklist"</span>, <span class="hljs-string">"/NH"</span>, <span class="hljs-string">"/FI"</span>, <span class="hljs-string">"IMAGENAME eq "</span> + name ];
</code></span></pre>


<h3 class="wp-block-heading">exit()とclose()</h3>



<p>アプリを終了する<em>Titanium.App.exit()</em>と、<br />
現在のウィンドウを閉じる<em>Titanium.UI.currentWindow.close()</em>がありますが、<br />
どのような違いがあって、どちらの方が良いのか、というお話。</p>



<p>試してみた結果、実行後即閉じるclose()に比べ、<br />
exit()は終了処理的な事をしているらしく、かなり動作がモッサリとしています。<br />
ただし、close()したらすぐにプロセスが消えるかというとそうではなく、<br />
だいたいexit()と同じぐらい待たされてからタスクリストから姿を消します。</p>



<p>exit()の方が安心そうではありますが、<br />
見た目だけでもサクッと閉じてほしいので、取り急ぎ今回はclose()を使っています。<br />
（そう思わせる程度には、exitはモッサリしています）</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>ひょっとしたら多重起動防止用の何かが既にあるかもしれないし、なくても今後実装されるかもしれませんが、<br />
とりあえず情報が見つからなかったので書いてみました。ツッコミありましたらよろしく願います。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
