私はC#/。NET 3.5/Windowsフォームプログラムに取り組んでいます。モードレスダイアログボックスを作成し、メインフォームから生成された情報で更新したいと思います。他の方向の例をいくつか見つけました。ダイアログボックスからの情報でメインウィンドウが更新されますが、逆方向に進むのに問題があります。ダイアログボックスのGUIが正しく機能しません。マウスカーソルは砂時計です。更新が表示されることもありますが、白いボックスが表示されたり、ダイアログボックスの上にあった他のウィンドウの残骸が表示されたり、フリーズしたりすることがよくあります。
最終的にダイアログボックスにはより複雑な情報が表示されますが、今のところ、メインウィンドウにラベルとして表示されるカウンターを複製しようとしています。ダイアログを起動するには、次のようにします。
bool secondWindowOpen = false;
Thread secondWindowThread;
MyPopupWindow secondWindow;
delegate void TextBoxDelegate(string message);
private void buttonPop_Click(object sender, EventArgs e)
{
// If the second window is not open, then open it
if (!secondWindowOpen)
{
secondWindowOpen = true;
secondWindow = new MyPopupWindow();
secondWindowThread = new Thread(secondWindow.MyMethod);
secondWindowThread.Start();
}
else // Close the second window
{
secondWindowOpen = false;
secondWindow.ShouldStop = true;
secondWindowThread.Join();
}
}
次のコードでカウンターを更新します。
if (secondWindow != null)
{
secondWindow.CounterText = args.FrameNumber.ToString();
}
モードレスダイアログボックスを制御するためのコードは次のようになります。テキストフィールドを設定するためのコードがおそらく間違っていることを認めますが、それは私が現在取り組んでいる最高のものです(呼び出し呼び出しは私に問題を与えていました)。
public partial class MyPopupWindow : Form
{
public MyPopupWindow()
{
InitializeComponent();
}
public bool ShouldStop
{
get { return shouldStop; }
set { shouldStop = value; }
}
private bool shouldStop = false;
public void MyMethod()
{
this.Show();
this.Refresh();
while (!shouldStop)
{
Thread.Sleep(100);
labelCounter.Text = CounterText;
Refresh();
}
this.Close();
}
public string CounterText;
}
私の大きな質問は次のとおりです。独自のGUI要素を更新する必要がある場合に、モードレスダイアログボックスを2番目のスレッドに配置するための最良の方法は何ですか。メインウィンドウ/スレッドからこれらのGUI要素を更新するための最良の方法は何ですか?ありがとう!