- - PR -
Class_Terminate()が実行されるタイミングでプロパティは存在しますか?
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-28 14:51
お世話になっております、koaraと申します。
Windows XP Pro SP2 VB6.0 SP6 という環境で業務アプリを作っています。 Class_Terminate()内でクラスのプロパティの値を参照している処理で、 プロパティの値が空になっている時があります、 Class_Terminate()内では既にプロパティの値が参照できることは保証されていないのでしょうか? 具体的には下記のクラスで関数の処理が終了する間の排他制御をしようとしています。 LockFile.cls
下記のようにLockFile.clsを使用しています。 testFunction.bas
testFunction()開始直後にmakeFile()でロックファイルを作成し、 EndSubを抜けた後にClass_Terminate()が実行され ロックファイルが削除されるという動作をさせてたいのですが、 既にsuffixが""の時があるようで
が失敗します、どこが問題なのでしょうか? アドバイスよろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2006-08-28 15:12
この宣言と同時のインスタンス化による弊害 (VB6 以前特有) の可能性があります。 'Lock' の参照が、Nothing になる直前に Terminate イベントが発生するわけですが、 その後、'Lock' という変数のメンバを参照すると、暗黙的にインスタンス化されてしまいます。 (Nothing であるハズなのに、勝手にインスタンス化され参照できてしまえるわけです) その後、参照が解放されると再度 Terminate イベントが発生します。 その際のインスタンスは、最初に作成されたインスタンスとは異なるため、 Suffix が長さ 0 の文字列になっているという可能性があるということです。 (わかりやすい説明ができなくて、申し訳ないです...) # ちなみに、この可能性が捨てられないのは、"処理...." と省略されている部分が不明だからです。 あまり考えられないのですが、危険回避のためにも、
このように修正することをお勧めします。 それと、
誤記がある (正しくは Exit Sub) ということは、正しく転記されていないわけで、 転記できていない部分に何か潜んでいるようにも思えます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-08-28 15:54
Exit Sub のところで、suffixがセットされずに、Class_Terminate()が走るのでしょう。 [ メッセージ編集済み 編集者: todo 編集日時 2006-08-28 15:55 ] [ メッセージ編集済み 編集者: todo 編集日時 2006-08-28 15:56 ] | ||||||||||||||||
|
投稿日時: 2006-08-28 17:22
じゃんぬねっとさん
レスありがとうございます。
の違いを考えていたらレスが遅くなってしまいました、すみません。 上記はどういう場合に違いがあるのでしょうか? 仰られている可能性というのはtestFunction()内で 再度testFunction()が呼び出される可能性のことだと解釈したのですが。 それでしたら無いと思います。 ただtestFunction()は連続して何回か実行される事があり、 そのような場合に前回のLockの参照が、Nothingにならず、 次のtestFunction()が呼び出されるということが起こるとすれば有り得ます。 testFunction()はシリアルラベルを発行するソフトの一部で、 商品バーコードを読み込み、枚数を入力するとDB上の在庫データを更新した後 シリアルを採番してラベルを発行します。 testFunction()はVBフォーム上の"DB書込み"ボタンに割り付けられております。 testFunction()の処理内容は
という感じです。 既存のアプリケーションにファイルによる排他処理を追加していたのですが、 更新処理が複雑で、分岐処理の末端まで抜けの無いよう ロックファイルの後処理をする自信がありませんでした。 そこで、デストラクタを利用することを考えたのですが甘かったようで、 ロックファイルが残ってしまうことがあります。 その原因がsuffixが""になっていて作ったロックファイルが分からなくなっているのでは ないかと考え表題のような質問をしました。
じゃんぬねっとさんの仰るとおり、 そういう心構えで探さないと見つかるバグも見つけられないですよね。 End Subの部分は転記ミスです、 実際は
| ||||||||||||||||
|
投稿日時: 2006-08-28 17:32
todoさん、レスありがとうございます。
正確に転記しなかった事をお詫びさせてください、 すみませんでした。
は実際
となっており、 Lock.IsFile = FALSE の場合、Class_Terminate()でロックファイル削除の処理はされません。 | ||||||||||||||||
|
投稿日時: 2006-08-28 17:36
やはり、言葉では説明しにくいですね。 実際に組んで頂いた方がわかりやすいです。
このコードと、
このコードでは、動作が違うことがわかるハズです。
そういうわけではないことは、上記を試されればわかるかと思います。 で、本題は todo さんのご指摘どおりである可能性があります。 なぜ、気付かなかったのだろう... orz ローカル変数である 'Lock' は、Exit Sub (プロシージャ) を抜けると、 自動的に参照カウントがデクリメントされ、Terminate イベントが発生します。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-08-28 19:28
上記のようになっているのであれば""は失敗しないと思いますが…… ""になっていると思われた根拠は何でしょう? あと、IsFile()の内容とメッセージボックスの内容が 一致していないようですが、ここは転記ミスではないですか?^^; (色々と省かれている可能性があるので念のためです。) | ||||||||||||||||
|
投稿日時: 2006-08-29 09:38
じゃんぬねっとさん、ありがとうございます。
動作の違いは実行してみて分かったのですが、 どうしてそのようになるかが分からず悩んでいましたが 先ほど理由がわかりました。
本題の件ですが、プログラムの要所でログを出力して動作を検証していたのですが ログの内容と解釈が不十分で問題点を勘違いをしていました。 具体的には以下のようなログを残していました。
当初b1->c1という一連の動作で出力されたログだと思っていたのですが、 実際にはc1は全く別に出力されており、b1のロックファイルが作成されたまま消えないという現象が問題でした。 c1が出力されていた理由はtodoさん、じゃんぬねっとさん、eterniaさんがご指摘の通りです。
b1がClass_Terminate()を呼ばずに終わる理由ですが、 ソースにEnd VBで終わる箇所があり気になっています。 End VBでも確実にClass_Terminate()が呼ばれるのか調べたいと思います。 |