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

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

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

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

Q&A

解決済

1回答

4276閲覧

「ウィンドウ ハンドルは既に存在します。」のアプリケーションエラーが発生する。

nobysanz

総合スコア42

C#

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

0グッド

0クリップ

投稿2015/11/26 03:56

お世話になります。
C#のプログラムにて、「ウィンドウハンドルは既に存在します。」のアプリケーションエラーが発生します。

フォームアプリケーションから、ポップアップウィンドウとしてAppication.Run でフォームを表示しております。問題なく動作していましたが、突然1回だけ発生し(アプリケーションエラーとなりました)その後は、再度プログラムを実行し、何もなかったように動作しております。

何が引き金になっているかご教授ください。

■発生しているソース

上位プログラムからは、ShowAircastNotifyをCALLしています。

private void ShowAircastNotify(int kind, string name)
{
// 表示するメッセージを取得
string Message = _ConfigInfo.FindMessage(kind, (int)Classes.Telegrams.TelegramStatus.enumStatusKind.ON_AIR);

// 表示 ThreadPool.QueueUserWorkItem(new WaitCallback(DisplayAircastNotify), string.Format(Message, name)); } /// ポップアップ表示スレッド private void DisplayAircastNotify(object parameter) { _AircastNotifyForm = new Forms.AircastNotify(); _AircastNotifyForm.DisplayStatus = (string)parameter; _AircastNotifyForm.StoppingRequest = new dmcaCommon.ComDef.DlgVoid_Void(ReqestStopping); _AircastNotifyForm.Owner = _OwnerForm; _AircastNotifyForm.DisplayWaitTime = _ConfigInfo.Settings.displayWait.cancel; Application.Run(_AircastNotifyForm); <<ここで発生!! }

■エクセプション
ソース "System.Windows.Forms" からのイベント ID 0 の説明が見つかりません。このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、インストールが壊れています。ローカル コンピューターにコンポーネントをインストールするか、コンポーネントを修復してください。

イベントが別のコンピューターから発生している場合、イベントと共に表示情報を保存する必要があります。

イベントには次の情報が含まれています:

内容:
ウィンドウ ハンドルは既に存在します。
スタックトレース:
場所 System.Windows.Forms.NativeWindow.CheckReleased()
場所 System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
場所 System.Windows.Forms.Control.CreateHandle()
場所 System.Windows.Forms.Form.CreateHandle()
場所 System.Windows.Forms.Control.get_Handle()
場所 System.Windows.Forms.Control.SetVisibleCore(Boolean value)
場所 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
場所 System.Windows.Forms.Control.set_Visible(Boolean value)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
場所 System.Windows.Forms.Application.Run(Form mainForm)
場所 CastSynchronize.CastSynchronize.DisplayAircastNotify(Object parameter) 場所 C:\CastSynchronize.cs:行 626
場所 System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state)
場所 System.Threading.ExecutionContext.runTryCode(Object userData)
場所 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack)
場所 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)

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

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

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

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

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

guest

回答1

0

ベストアンサー

_AircastNotifyFormを複数スレッドで共有しているせいです。

ShowAircastNotifyを複数回連続で呼び出したとき、あるスレッドのDisplayAircastNotifyで_AircastNotifyFormを設定した後Application.Runまでの間に別スレッドのDisplayAircastNotifyが動き出すと_AircastNotifyFormを上書きしてしまいます。
すると1つの_AircastNotifyFormを複数のスレッドでRunしてしまい予期せぬエラーが色々します。

今回はたまたまウィンドウの作成処理が2つのスレッドから同時に行われたため、あとのほうのスレッドではもうウィンドウは作ってるよ、という例外が発生したと思われます。

かぶるのがたった5行なのでなかなか再現は難しいと思います。

投稿2015/11/26 05:44

toki_td

総合スコア2850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問