52231


環境  
OS：windows7 64bit  
VisualStudio2015 C# windowsアプリ

上記環境でのwindowsアプリを作成しています。  
質問させていただいている内容は、メイン画面にテキストやボタンのコントロールが貼り付けられたものがあったとして、OCX からのイベント受信するための
UserControl を継承したカスタムコントロールも貼り付けられてたとします。  
動作としては、

  * (1)メイン画面からユーザ操作でボタン押下すると、カスタムコントロールのＡＰＩを呼び出し、ＯＣＸの先につながっているデバイスに要求を出します。
  * (2)ＯＣＸはその要求を受信すると、何かしら処理して応答（カスタムイベント）をカスタムコントールに返します。
  * (3)デバイスからは不定期に状態通知（カスタムイベント）がカスタムコントールに送信されてきます。

そこで質問なのですが、(1)実施中に(2)または(3)が実行されることは無いのでしょうか？  
.net framework の仕組みとして、同一画面(Form?)上に配置したコントールは同時に動作することはないのでしょうか？

具体的には、(1)は人間が押したタイミングで、メイン画面のコンテキストでカスタムコントールのＡＰＩを呼び出しています。この(1)実行中に、(2)または(3)のイベントがカスタムコントールに通知された場合、カスタムコントールは、(1)
実行中でもイベント実行されることはあるのでしょうか？


CC BY-SA 4.0
2019-01-23T02:11:48.600
52228
2019-01-23T05:12:31.093
13909
question
c# windows
windows C#.net アプリにて同一画面上に張り付けたボタンコントールとＯＣＸイベントを受信するカスタムコントールは同時に動作しないか


OCX内部やアプリケーションの作りによりますが、可能性はあります。

アプリケーション内のそれぞれのイベント処理の中で DoEvents
やそれに相当する処理を行っていると、あるイベント処理の中で別のイベント処理が入れ子になって始まり、同時に実行されているように見えるはずです。これは.NETではない昔のVBでも起こっていたと思います。

アプリケーションやOLEコンテナ(この場合はカスタムコントロール?)から
[IOleControl::FreezeEvents](https://docs.microsoft.com/ja-
jp/windows/desktop/api/ocidl/nf-ocidl-iolecontrol-freezeevents) を TRUE
で呼び出すと、イベント通知を停止するか、再開指示(FALSE設定)するまでの間に発生したイベントをバッファリングするように指示したことになりますが、OCX側がそれに対応した処理
[COleControl::OnFreezeEvents](https://docs.microsoft.com/en-
us/cpp/mfc/reference/colecontrol-class?view=vs-2017#onfreezeevents)
を実装していないと意味がありません。  
呼び出し側は、アプリケーションが呼び出していなくても、言語のランタイム等が自動的に判断して呼び出している場合があります。

参考：[コントロールの実装 |
EternalWindows](http://eternalwindows.jp/browser/activex/activex05.html)

それから、OLE/COM/ActiveX
のメソッド呼び出し/プロパティ操作/イベント通知は、そのインスタンスを作成したスレッドで行うことが基本となっていますが、OCX内部でワーカースレッドを作成・使用するのは自由ですし(むしろI/O制御では無いと話にならない)、プロセス内だけで閉じた処理だとメモリ的にはアクセス可能なので、アプリケーション側からもOCX側からも、作成スレッドに関係なく呼び出しが出来てしまいます。(それで正常に動作するかは別です)

OCXもアプリケーションも、その辺を意識して作らないと、例外・デッドロック・処理シーケンス違いなど、様々な問題が発生する可能性があります。


CC BY-SA 4.0
2019-01-23T03:11:21.090
52231
2019-01-23T05:12:31.093
2019-01-23T05:12:31.093
26370
26370
52228
answer