スレッドでフォームを作成すると、スレッドが完了するとフォームが消えます。フォームが存続するよりも長く存続させるには、スレッドを有効にしておくか、アプリケーションのメインスレッドでフォームを作成する必要があります。後者が好ましいだろう。それぞれのオブジェクトが対応するフォームのイベントリスナーに接続するようにし、フォームを更新するときは必要に応じてInvoke
またはBeginInvoke
を使用してください。
簡単な例:まず
ワーカー: クラスワーカー {公共のイベントのEventHandler SomethingHappened。
protected void OnSomethingHappened(EventArgs e)
{
var evnt = SomethingHappened;
if (evnt != null)
{
evnt(this, e);
}
}
public void Work()
{
// do lots of work, occasionally calling
// OnSomethingHappened
}
}
その後、我々はSomethingHappenedイベントのイベントハンドラを持つ形で:
Worker w = new Worker();
ProgressForm f = new ProgressForm;
w.SomethingHappened += f.SomethingHappenedHandler;
f.Show();
Thread t = new Thread(w.Work);
t.Start();
免責事項:
public void SomethingHappenedHandler(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
this.Invoke(new Action(() => SomethingHappenedHandler(sender, e)));
return;
}
// update gui here
}
そして、それは本当にすべて一緒にそれを配線するだけです:このサンプルはすばやく投げ込まれ、ややテストされていません(電車に座って降りていく)。
どうすればいい?スレッドからメインフォームを起動し、新しいフォームを作成しますか? – Leonardo
@レオナルド:更新された答えを見てください。 –
私はそれほど気に入らなかったが、アイデアを使った。 Tks! – Leonardo