前回の記事では、一応動いたが致命的な欠陥があると書いた。
まともに動作するのは、
・設定画面を出さずに使用するか、
・設定でCOMポートを選択するのは1回のみ
という条件がある。
致命的なのは、
設定画面を何度も出すと、ASCOMがエラーを出す。
エラーを出すだけならましな方で、
上位アプリ(MaxImDLやNINA)を巻き込んで落ちてしまう。
これはまずい。
これは、ASCOMが出すエラー画面。
何かごちゃごちゃした画面だが、COMポートのオープンに失敗したのだ。
COMポートのアクセスが拒否されたという、わかりにくいメッセージだ。
どうも設定画面を開く度にオープン処理へ飛んでいるようだ。
そして一度オープンすると、
そのままオープンしたままの状態ではないかと推測した。
このあたりの挙動がどうにもわからない。
ここは、オープン時の処理に例外処理を追加した。
(2つ下の画像で、上の大きい赤枠の部分が例外処理で改変した部分)
この例外処理にて、メッセージを簡略化し、
ASCOMには迷惑をかけないようにもなった。
しかし、劇的に改善したのは、小さいが2個目の赤枠に「?」を入れたこと。
これで、上位アプリ(MaxImDLやNINA)を巻き込んで落ちることはなくなった。
これで安心して使うことができる。
意味的にはデストラクタ(※)によりCOMポートをクローズする処理で、
nullでない場合にクローズするようにした。
これは、IF文でnullかどうかを判定しても同じことで、
C#はこんな書き方があるのかと感心したくらいだ。
(このドライバはC#で書かれている、VB.NETとは言語仕様が大きく違う)
※デストラクタとは、コンストラクタと対になっている。
今回の場合、
■コンストラクタ class Dome で記述して、
COMポートの定義を行い、COMポートのオープン、通信を行う
■デストラクタ class ~Dome で記述して、
COMポートの使用終了時に、OS(.Netframework)から呼ばれて
リソースの開放等の記述をしておく
C++ではデストラクタの呼び出しは可能だが、C#ではそれは出来ない
デストラクタは省略も可能だが、
リソースの開放を確実にするためには記述しておく
ということらしい。
これを読んで理解できる人は相当なものだ。
おいらはほんの少しだけしか分からない。
というか分かったようで何も分かっていないというのが正しい。
実を云うと、C#は触るのが今回初めてで、全くのド素人なのだ。
C#はC言語の親戚みたいなものという認識でしかない。
ズブのド素人がASCOMドライバをいじること自体が、そもそもおかしい。
ASCOMの神様がお怒りになるのもご尤もである。
とはいえ、今の世の中はDX推進の流れになってきている。
(DXはデラックスではないよ、多くの老人はデラックス派だけどなw)
DX推進の流れに乗って、還暦過ぎた爺が無謀な改修を行っている。
ASCOMの神様も大目に見てくれるとありがたい。
まあ自分一人が使うだけなので、そこは覚悟の上でってことで。
これで今の所は安定的に動作はしている。
ドームドライバの改修はこれにて終了とする。
コメントする