ユーザーの入力に基づいて実行する ExecuteCommand という関数があります。これらのことは、単純に Console.Writeline() を実行したり、フォームのチェック ボックスをオンにしたり、別のプロセスへのキーストロークをシミュレートしたりして、自分自身とは完全に独立しています。関数は別のスレッドで実行されるため、UI を変更するには呼び出しが必要になります。私には 2 つの方法があります... そのうちの 1 つは良い方法かどうかわかりませんが、非常に簡単です。
以下のコード、3行目は私が質問したいものです:
private void ExecuteCommand()
{
this.Invoke((MethodInvoker)delegate()
{
if (current_line_index < command_que.Count)
{
current_line = command_que[current_line_index];
if (current_line.StartsWith(">>Auto Enter"))
{
chkAutoEnter.Checked = false;
}
else if (current_line.StartsWith("+WinWait("))
{
string title_to_wait_for = current_line;
title_to_wait_for = title_to_wait_for.Remove(0, "+WinWait(\"".Length);
title_to_wait_for = title_to_wait_for.Remove(title_to_wait_for.Length - 2, 2);
t_WinWait = new Thread(() => WinWait(title_to_wait_for));
t_WinWait.Name = "WinWait";
t_WinWait.Start();
}
}
});
}
コードは完全に機能します...しかし、それが良い習慣かどうかはわかりません。
または、次のような方法で UI を変更できることもわかっています。
private delegate void CheckCheckBoxHandler(bool checked);
private void CheckCheckBox(bool checked)
{
if (this.chkAutoEnter.InvokeRequired)
{
this.chkAutoEnter.Invoke(new CheckCheckBoxHandler(this.CheckCheckBox), checked);
}
else
{
chkAutoEnter.Checked = checked;
}
}
しかし、別のスレッドから変更されるフォームに複数のコントロールがあるため、最初の例の単純な方法とは対照的に、それを行うには多数の関数を追加する必要があります。
とにかく最初の方法は悪いですか?まだ遭遇していないリスクはありますか? 本当でよさそうですね…
ありがとう!