起動されている数を記録するには

解決


るるとん@K  2004-04-25 21:40:18  No: 8635

アプリケーション起動時に、既に起動済みなら、
Unit1のとある論理型に代入し、
MainFormのonCreate時のスプラッシュ表示処理を、
省きたいのです。
私的に考えたのは、
とあるファイルに起動されてる数を記録し、
起動されたら増やし、終了したら減らす、
というものですが、
異常終了したら、処理が行われないので、
良い方法はないかと?


jok  2004-04-25 22:10:26  No: 8636

自分のアプリがいくつ起動されているか、動的に取得できればいいのですね?
SetProp() GetProp() というAPIで Application ウィンドウにしるしをつけておいて
その数を数えます。Unit1 を以下のようにして試したところ、うまくいくようです。

function EnumWndProc(hWindow:HWND;lData:LPARAM):BOOL;stdcall;
var
  pNum:PInteger;
begin
  result := true;
  pNum := PInteger(lData);
  if GetProp(hWindow,'HogeHoge') = 123456 then
    pNum^ := pNum^+1;
end;

function EnumMyApp:integer;
begin
  result := 0;
  EnumWindows(@EnumWndProc,LPARAM(@result));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := IntToStr(EnumMyApp);
end;

initialization
  SetProp(Application.Handle,'HogeHoge',123456);
finalization
  RemoveProp(Application.Handle,'HogeHoge');
end.


るるとん@K  2004-04-25 22:58:19  No: 8637

initialization
  SetProp(Application.Handle,'HogeHoge',123456);
finalization
  RemoveProp(Application.Handle,'HogeHoge');
はユニットの最後で良いのでしょうか?


ふぐちゃん  2004-04-25 22:58:55  No: 8638

るるとん@Kのご質問の真意は
起動されている数を記録したいのか
それとも
多重起動していたらスプラッシュの表示を省きたいのか
どちらでしょうか?
後者なら、ミューテックスを利用して多重起動かどうかを判断し、
その結果でスプラッシュを表示するかどうか選択すればよいと思います。
ミューテックスについてはOpenMutexやCreateMutexで検索すれば
たくさん情報が出てきます。


るるとん@K  2004-04-25 23:02:04  No: 8639

ミューテックなら、初めのウインドウを閉じたら、なくなるのじゃ無いですか?


るるとん@K  2004-04-25 23:09:21  No: 8640

るるとん@K
123456っていうのは何でしょう?
SetPropのヘルプがでません


るるとん@K  2004-04-25 23:10:40  No: 8641

1のときだけ表示するようにするんですね
出来ました


jok  2004-04-25 23:28:28  No: 8642

> 1のときだけ表示するようにするんですね

あっ、そういう場合は「二重起動の禁止」というふうに言います。
ミューテックスを使うのが一般的です。
例えばこことか。

http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N011.html


jok  2004-04-25 23:33:46  No: 8643

> ミューテックなら、初めのウインドウを閉じたら、なくなるのじゃ無いですか?

そうです。ですから、次に起動されたとき、自分が最初の一つであることが分かるわけです。
それでいいんじゃないですか?


jok  2004-04-25 23:40:12  No: 8644

あっ、そうか、二重起動の禁止じゃなくて、すでに起動されてたら、スプラッシュ
を表示しない、とかのようにしたいわけですね。それなら、ミューテックスより、
わたしの最初のコードの方が使いやすいですね。


ふぐちゃん  2004-04-25 23:42:21  No: 8645

> ミューテックなら、初めのウインドウを閉じたら、なくなるのじゃ無いですか?
私がした質問への回答はどうなりましたか? (^^;;


るるとん@K  2004-04-26 01:44:45  No: 8646

多重起動していたらスプラッシュの表示を省くのが最終の目的です


ふぐちゃん  2004-04-26 02:30:08  No: 8647

>多重起動していたらスプラッシュの表示を省くのが最終の目的です
わかりました。

>jokさん
>あっ、そうか、二重起動の禁止じゃなくて、すでに起動されてたら、スプラッシュ
>を表示しない、とかのようにしたいわけですね。それなら、ミューテックスより、
>わたしの最初のコードの方が使いやすいですね。
すでに起動しているかどうかという情報をOpenMutexで取得して、
"禁止"しなければよいのではないでしょうか?


jok  2004-04-26 02:44:32  No: 8648

> すでに起動しているかどうかという情報をOpenMutexで取得して、
> "禁止"しなければよいのではないでしょうか?

そうですね。二重起動の禁止では、常に一つのアプリしか起動していないので
勘違いしていました。OpenMutex ではなく CreateMutex の方が一度ですみ
ますね。EnumWindows() はコストがかかるので、ミューテックスの方が
いいですね、たしかに。参考サイトのコードをつかって

const
  UN:string = 'HogeHoge';

function IsPrevAppExist(UniqueName:string):Boolean;
begin
  result := false;
  CreateMutex(nil,true,PChar(UniqueName));
  if GetLastError = ERROR_ALREADY_EXISTS then
    result := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not IsPrevAppExist(UN) then
    ShowMessage('This is Splash Message!');
end;

のようにしてうまくいきました。


るるとん@K  2004-04-26 03:02:43  No: 8649

ウインドウAを開く、
(ミューテックが生成される)
(スプラッシュ表示)
  ウインドウBを開く
  ウインドウAを閉じる
(ミューテック解放)
(この状態で、Bは開かれている)
  ウインドウCを開く
(スプラッシュ表示)
には、なるのでは?


jok  2004-04-26 03:33:38  No: 8650

わたしのコードを試しましたか?

ミューテックスはウィンドウとは関係なく、プロセスが終了すると参照カウント
が減るようになっています。それをつくったすべてのプロセスが終了すると
参照カウントがゼロになるので、ミューテックスが消滅します。上のコードでは
メインウィンドウの OnCreate イベントハンドラでつくっていますので、アプリが
終了するまで、参照カウントが減りません。


jok  2004-04-26 03:40:03  No: 8651

ウインドウAを開く、
(ミューテックが生成される)  → 参照カウント 1
(スプラッシュ表示)
  ウインドウBを開く       → 参照カウント  2
  ウインドウAを閉じる     → 参照カウント  1
(ミューテック解放)            はしない
(この状態で、Bは開かれている)
  ウインドウCを開く       → 参照カウント 2
(スプラッシュ表示)            は表示されない
には、なるのでは?


るるとん@K  2004-04-26 04:01:53  No: 8652

有難う御座います
うまく行きました


jok  2004-04-26 04:02:55  No: 8653

ちょっと話はずれますが、SDI式のエディタをつくってるんでしたね?
このスレの質問から類推すると、ドキュメントを読み込むたびに、違うプロセス
を立ち上げているんですよね? 有名な秀丸エディタもSDI式ですが、プロセスは
一つらしいです。Delphi で同じようにするためにはちょっと工夫が必要です。
中村さんの

http://www.asahi-net.or.jp/~HA3T-NKMR/tips025.htm

が大変参考になると思います。


るるとん@K  2004-04-26 05:14:45  No: 8654

参考になります。読ませていただきますn(__)n


ふぐちゃん  2004-04-26 06:02:58  No: 8655

> jokさん
> OpenMutex ではなく CreateMutex の方が一度ですみますね。
参考になりました。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加