質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

4回答

9344閲覧

多重起動時の処理について

elvis

総合スコア29

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2016/06/25 07:25

###前提・実現したいこと
仮に「メールが届いたら差出人のアドレスを引数として指定したプログラムを開いてくれるミドルウェア」があるとします。

私は「ミドルウェアから受け取った差出人のアドレス一覧を常に表示するアプリ」を作る予定とします。

そこで質問です。

初回起動の時は簡単です。
しかしそれ以降は、どうすれば既に起動しているプロセスに引数を受け取ることができるのでしょうか。

あくまでプロセスは別ですよね? なので、多重起動の確認を行って既に起動してるプロセスを捉えて引数を渡す?ような処理が必要なのでしょうか?わかりません…。

ミドルウェアの処理から組めば簡単ですが、このパターンの手法が知りたいです。

どうかご教授ください。宜しくお願い致します

開発言語 C#

###仕掛中のコード(動く状態ではありませんが)
//起動中のプロセスを取得
Process hThisProcess = Process.GetCurrentProcess();
Process[] hProcesses = Process.GetProcessesByName(hThisProcess.ProcessName);
int iThisProcessId = hThisProcess.Id;

//起動中のプロセスがある場合 if (hProcesses.Length >= 2) { foreach (Process hProcess in hProcesses) { if (hProcess.Id != iThisProcessId) { //アクティブに Microsoft.VisualBasic.Interaction.AppActivate(hProcess.Id); //Process.Start("", "1234@gmaol.com"); } else { Application.Exit(); } } } //初回起動 else { Application.Run(new form("5432@gmaol.com")); //起動 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

多重起動防止(+排他制御)とプロセス間通信を組み合わせて作ります。
だいたい以下のような流れになると思います。

  1. 起動直後(Mainメソッドの先頭)でMutexオブジェクトを作成。Mutexはstaticフィールドに作る。

作成時に所有権を取得するようにし、新規作成かどうかのフラグを受け取る。

  1. Mutexが既存オブジェクトをオープンした(新規作成ではない)場合は、引数をプロセス間通信でサーバー側に送信し、プロセス終了。
  2. 初回起動の場合は処理を継続し、フォームのLoadイベントあたりでプロセス間通信の準備をする。
  3. 準備が完了したらMutexの所有権を解放。
  4. 引数を処理する(受信イベント呼び出し)。
  5. フォームを閉じるときにMutexもCloseする。

投稿2016/06/25 15:00

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

elvis

2016/12/21 06:50

遅くなってすみません。お陰で無事解決致しました。 ありがとうございます。
guest

0

ご質問のケースの場合、Windowsサービスとしてプロジェクトを作成する方法が適しているかと思います。タスクマネージャで表示されるような常駐サービスはプログラムとして作成できます(ご存知ならすみません)。プログラムはWindowsサービスとして常駐し、タイマーイベントでメールをチェックして、受信している場合に該当処理を行う感じでしょうか。

Windows サービス アプリケーション で検索すれば関連する情報が有るかと思います。

VisualStudio2012でサービスを作成する手順です。サービスは何本か作成したことが有るのですが、リソース権限やバックグラウンドで動かすことの制限などでつまづくことが良くありました。フォアグラウンドのプログラムを作成するよりハードルは高いかと思います。

投稿2016/06/25 08:29

編集2016/06/25 08:30
BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

elvis

2016/06/26 14:17

ありがとうございます。Windowsサービスでの実装も参考にさせていただきます。
guest

0

こんにちは。

あくまでプロセスは別ですよね? なので、多重起動の確認を行って既に起動してるプロセスを捉えて引数を渡す?ような処理が必要なのでしょうか?わかりません…。

既に起動されているプロセスの情報と新しく起動されたプロセスのコマンドライン・パラメータの両方を残す必要があるなら、多数あるプロセス間通信のどれかを用いて必要な情報を引き継ぎます。

因みに、ご提示されたコードは、多重起動を防ぐ仕組みとしては少し危険かも知れません。
そのミドルウェアからほぼ同時に2つ起動されることがあり得ない(1つ起動後、それが起動したことを確認して次へ進む場合等)、かつ、他から起動されないなら問題ないですが。

そうでない場合、ほぼ2つ同時に起動されると、Process.GetProcessesByName()を実行後、if (hProcesses.Length >= 2) 実行前までにもう1つが起動してしまうと問題がでます。頻発しないけど稀におかしくなりますので中々嫌な不具合となります。
それを防ぐために二重起動を禁止するの手法を良く使います。

投稿2016/06/25 07:53

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

elvis

2016/06/26 14:11

ご丁寧にありがとうございます。 Mutexを使用する方法で実装したいと思います。
guest

0

C# プロセス間通信(IPC)
この辺りでどうでしょう?

投稿2016/06/25 07:40

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

elvis

2016/06/26 14:00

ありがとうございます。簡単に考えすぎていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問