ハードウェアとの通信(シリアルポート通信)のためにタイマーを実行しています。タイマーに基づいてフォームを表示
データ受信イベントが発生したとき別のフォームを開く必要があり、アラームを示す画像ボックスを表示する必要があります。
タイマーの実行中に、親フォームから子フォームを表示する際に問題が発生しました。子フォームは、呼び出される必要があるため、継続的に呼び出されます。
誰かがこの問題を解決するのを手伝ってください。タイマーを使用して、フォームに
ハードウェアとの通信(シリアルポート通信)のためにタイマーを実行しています。タイマーに基づいてフォームを表示
データ受信イベントが発生したとき別のフォームを開く必要があり、アラームを示す画像ボックスを表示する必要があります。
タイマーの実行中に、親フォームから子フォームを表示する際に問題が発生しました。子フォームは、呼び出される必要があるため、継続的に呼び出されます。
誰かがこの問題を解決するのを手伝ってください。タイマーを使用して、フォームに
は次のようにフォームの変数を宣言:
private AlarmForm frmAlarm;
private bool formShowing;
private void YOUR_TIMER_EVENT_HANDLER(object sender, EventArgs e)
{
if(formShowing) return;
frmAlarm=null;
frmAlarm=new AlarmForm();
formShowing=true;
frmAlarm.Closed+=(a,b)=>{formShowing=false;};
frmAlarm.Show();
}
我々はフォームを表示するとき私たちはtrue
にformShowing
変数を設定します。次の行では、アラームフォームが閉じられたときにに接続するイベントをformShowing
〜false
に設定します。
複数のイベントを管理する必要があり、それぞれのイベントで1つのフォームが表示されるように思えます。
これが当てはまる場合、受け取ったイベントを保持するためのデータ構造と、子フォームがすでに表示されているかどうかを示すフラグが必要です。
Dictionary<string,bool> wasChildFormDisplayed = new Dictionary<string,bool>();
// event received - someString uniquely identifies the event
if (!wasChildFormDisplayed.ContainsKey[someString])
wasChildFormDisplayed.Add(someString, false);
if (!wasChildFormDisplayed[someString]) {
// ... code that opens child form ...
wasChildFormDisplayed[someString] = true;
}
あなたがスレッドを使用している場合、あなたはwasChildFormDisplayed
の同時読み取りおよび書き込みを防ぐためにロックを使用する必要があることに注意してください。
問題を示すコードを入力してください。 –