- PR -

Class_Terminate()が実行されるタイミングでプロパティは存在しますか?

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-29 09:46
引用:

koaraさんの書き込み (2006-08-29 09:38) より:

b1がClass_Terminate()を呼ばずに終わる理由ですが、ソースにEnd VBで終わる箇所があり気になっています。
End VBでも確実にClass_Terminate()が呼ばれるのか調べたいと思います。     


"End VB" の意味が良くわからないのですが、ローカル変数の場合は、
参照カウント法による作用で、そのプロシージャが終了されるタイミングで Terminate イベントが発生します。
これは、End Sub であろうと、Exit Sub であろうと同じです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
koara
ベテラン
会議室デビュー日: 2005/09/16
投稿数: 96
投稿日時: 2006-08-29 10:03
eterniaさん、ありがとうございます。

引用:

上記のようになっているのであれば""は失敗しないと思いますが……
""になっていると思われた根拠は何でしょう?


は先ほどじゃんぬねっとさんへのレスの通りという訳です。

引用:

あと、IsFile()の内容とメッセージボックスの内容が
一致していないようですが、ここは転記ミスではないですか?^^;
(色々と省かれている可能性があるので念のためです。)


IsFile()という名前と関数の内容があってないですね、
こちらは転記ミスではありません苦笑

スムーズに現状を理解していただく為にもソースをなるべく正確に転記するのが回答して頂く方への礼儀ですね。

質問する際は問題部分を正確に切り出せるように努力します。
koara
ベテラン
会議室デビュー日: 2005/09/16
投稿数: 96
投稿日時: 2006-08-29 10:17
じゃんぬねっとさん、レスありがとうございます。

END VBは、Endステートメントのことを言っています。
http://msdn2.microsoft.com/ja-jp/library/0wt87xba.aspx

解説を見ると参照をすべて無効にするようですので、
仰られるとおりTeminateイベントが発生すると思われます。

ログを見る限りTerminateイベントが発生しないタイミングがあるように見えるのですが、
何分ログが不十分なので、ログの情報を増やしてTerminateイベントが発生しているか調べています。
引用:

時間,vbのフォーム名(App.ThreadID),(インスタンス作成)などイベントを記述


フォーム名の後ろにスレッドIDを記述してLockFile.clsの生成・破棄のペアを明示的にしています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-29 11:04
引用:

koaraさんの書き込み (2006-08-29 10:17) より:

END VBは、Endステートメントのことを言っています。
解説を見ると参照をすべて無効にするようですので、
仰られるとおりTeminateイベントが発生すると思われます。


とはいえ、アンロックするメソッドを定義しておいて、
しかるべきタイミングで明示的にそのメソッドを呼ぶようにした方が良いですね。(可読性も良い)
もちろん、Terminate でのアンロックも保険として、そのまま残します。

しかし、こういう排他ロックはリスキーなのでお勧めはできないですね。
ロック ファイルは、PHP くらいでしか使ったことがないですね。
(それも、配布しやすくするためという理由でやむなく)

あまりお役に立てなくて申し訳ありません。
とりあえず、ログの調査を頑張ってください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
y.o
会議室デビュー日: 2006/08/29
投稿数: 2
投稿日時: 2006-08-29 12:00
VB6.0で、Endステートメントを使用すると、Terminateは呼び出されません。

以下、VisualStudio6付属のMSDNより

-------------------
メモ End ステートメントは、Unload、QueryUnload、および Terminate イベントまたはその他の Visual Basic コードが起動しなくても、即時にコードの実行を停止します。フォームおよびクラス モジュールの Unload、QueryUnload、および Terminate イベントに記述されたコードは実行されません。
-------------------
koara
ベテラン
会議室デビュー日: 2005/09/16
投稿数: 96
投稿日時: 2006-08-29 13:51
y.oさん、解決しました。

もしかしたらと思い Endステートメントの手前で参照を Nothingにしてやったところ、
ロックファイルが削除されないという現象は起こらなくなりました。

ありがとうございました。
koara
ベテラン
会議室デビュー日: 2005/09/16
投稿数: 96
投稿日時: 2006-08-29 14:01
じゃんぬねっとさん、解決しました。
ありがとうございました。

Endステートメントが原因だったようで、
その部分を訂正して、今のところ再現しておりません。

引用:

しかし、こういう排他ロックはリスキーなのでお勧めはできないですね。
ロック ファイルは、PHP くらいでしか使ったことがないですね。
(それも、配布しやすくするためという理由でやむなく)



ご指摘ありがとうございます、
まずはアンロックするメソッドを明示的に呼び出すようにしました。

ちなみに、ファイル以外でのロックというとどういう方法が一般的になるのでしょうか?

スキルアップ/キャリアアップ(JOB@IT)