質問: 環境 OS:windows7 64bit VisualStudio2015 C# windowsアプリ 上記環境でのwindowsアプリを作成しています。 質問させていただいている内容は、メイン画面にテキストやボタンのコントロールが貼り付けられたものがあったとして、OCX からのイベント受信するための UserControl を継承したカスタムコントロールも貼り付けられてたとします。 動作としては、 * (1)メイン画面からユーザ操作でボタン押下すると、カスタムコントロールのAPIを呼び出し、OCXの先につながっているデバイスに要求を出します。 * (2)OCXはその要求を受信すると、何かしら処理して応答(カスタムイベント)をカスタムコントールに返します。 * (3)デバイスからは不定期に状態通知(カスタムイベント)がカスタムコントールに送信されてきます。 そこで質問なのですが、(1)実施中に(2)または(3)が実行されることは無いのでしょうか? .net framework の仕組みとして、同一画面(Form?)上に配置したコントールは同時に動作することはないのでしょうか? 具体的には、(1)は人間が押したタイミングで、メイン画面のコンテキストでカスタムコントールのAPIを呼び出しています。この(1)実行中に、(2)または(3)のイベントがカスタムコントールに通知された場合、カスタムコントールは、(1) 実行中でもイベント実行されることはあるのでしょうか?
回答: OCX内部やアプリケーションの作りによりますが、可能性はあります。 アプリケーション内のそれぞれのイベント処理の中で DoEvents やそれに相当する処理を行っていると、あるイベント処理の中で別のイベント処理が入れ子になって始まり、同時に実行されているように見えるはずです。これは.NETではない昔のVBでも起こっていたと思います。 アプリケーションやOLEコンテナ(この場合はカスタムコントロール?)から IOleControl::FreezeEvents を TRUE で呼び出すと、イベント通知を停止するか、再開指示(FALSE設定)するまでの間に発生したイベントをバッファリングするように指示したことになりますが、OCX側がそれに対応した処理 COleControl::OnFreezeEvents を実装していないと意味がありません。 呼び出し側は、アプリケーションが呼び出していなくても、言語のランタイム等が自動的に判断して呼び出している場合があります。 参考:コントロールの実装 | EternalWindows それから、OLE/COM/ActiveX のメソッド呼び出し/プロパティ操作/イベント通知は、そのインスタンスを作成したスレッドで行うことが基本となっていますが、OCX内部でワーカースレッドを作成・使用するのは自由ですし(むしろI/O制御では無いと話にならない)、プロセス内だけで閉じた処理だとメモリ的にはアクセス可能なので、アプリケーション側からもOCX側からも、作成スレッドに関係なく呼び出しが出来てしまいます。(それで正常に動作するかは別です) OCXもアプリケーションも、その辺を意識して作らないと、例外・デッドロック・処理シーケンス違いなど、様々な問題が発生する可能性があります。