関数

 フレームワークがバーチャルメソッドを実行した時に、そのバーチャルメソッドがGUIからの入力を必要とする。このときバーチャルメソッドの途中でスレッドを止めざるを得ない。

 この問題がどういう場所に位置しているのかすらまるで分かってないし、なにが問題なのかもはっきりしない。とりあえず先に進もう。

 ShowDialog出来ればいいのだけどウインドウが出たり消えたりするのは嫌だ。しかしGUIはシングルスレッドアパートメントだ。ここの問題がまず見えるけれどもControl.Invokeすればどうとでもなるっちゃなる。でもいろいろ問題が出る。

 GUI自身は自分が別スレッドから実行されるかは知らないと考えるのが自然かもしれない。だとするとInvokeをパブリックに外部に見せてやり、必要に応じてInvokeを介して呼び出すことになるだろう。Invokeを外に見せるということは別スレッドから呼ばれることを想定してるということじゃないかという話にはなる。だったらパフォーマンスの話はとりあえず無視しておいて、パブリックに外部に見せているメソッドは全部Invokeを介しておく、ということをGUI側がやっといてくれてもいいはずだが、それよりはInvokeを外部から呼び出すほうがまだマシな気がする。

 で、GUIのもろもろが終了した後、ウインドウを閉じないで止めてたスレッドを再開するとなると、ここでマルチスレッドになる。GUIは一旦全入力を止めて何も出来ないようにしとく必要がある。なんだこれは。

 でもこれは本質じゃないと思う。

 こういうややこしいことをしないで済むためには、一旦スレッドを終了して続きから行えるようにしなきゃいけない。それもこれもGUIが全ての関数が終了した状態を基本とするからで、そうしなきゃいけないのは入力に対応する必要があるからだ。入力とは一体なんなのか。関数の秩序がなんでこんなにずたずたに破壊されなきゃならないのか。

 欲しいのはGUIのスレッドでフレームワークを実行し、バーチャルメソッドの途中で入力待ち状態に至る技だ。入力を終えた後メソッドの続きを実行したい。

 スレッドをループにして、Application.DoEventsでやる? ダメだ。話にならない。なんなんだこりゃ一体。