[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/05/29(Mon) 19:26
投稿者名:MAKO
Eメール:
URL :
タイトル:
VBの常駐処理で、突然改名が不可能に・・・・
一日中色々調べてはみたものの、原因が分からず質問させて頂きます。
なにぶん素人に近い状態なので、うまく説明出来るか分かりませんが、ご了承下さい。

環境 
  OS:Windows2000
  開発:VB6.0

「A」という、VB6.0で作成した常駐プログラムがあります。
「A」は、フォームを持っていません。
SleepとDoeventsを利用し、ループを繰り返しながら動いております。
トリガーファイル(Web画面より作成)が存在したならば別のプログラムを
実行する仕様です。実行後、再度ループを繰り返します。

この「A」が、ハングアップ(処理が固まる)する現象が稀に起きると
いう事で、「A」に年月日時分秒をつけた起動ファイルを吐き出させるようにしました。
この起動ファイルは、Name関数を利用しループ毎に改名するようにしました。
ex)A_20060529182630.txt

「A」の起動ファイルを監視する、常駐プログラム「B」をVB6.0で
作成しました。こちらも、SleepとDoeventsと利用した処理です。
「B」は、「A」が吐き出す起動ファイルの年月日時分秒を調査し、
一定時間以上過ぎていたら、「A」に対し、リブートを行います。

テスト時は、うまく動きました。 いざ本番稼動を始めると、しばらくはうまく動いて
いたのですが(この時は2時間くらい)、突然「A」の起動ファイルの改名が出来なくなりました。
※トリガーファイルをおいても目当てのプログラムの起動すらしない状態。固まってる?
当然「B」が「A」のリブートを行います。この際、「A」の起動ファイルを削除します。
「A」が起動し、起動ファイルを作成します。しかし、改名が行われない。
※改名1回目で固まっている?
※この時も、トリガーファイルをおいても起動プログラムの起動すらしない状態。

実際の処理の内容は下記のようになっております。

<Aの内容>
起動ファイル作成
Do While (True)
 起動ファイル改名
 IF トリガーファイル存在 Then
  目当てのプログラム起動
 End If
 Sleep(2000)
 Doevents
Loop

<Bの内容>
Do While (True)
 A起動ファイル取得
 IF 現在時刻 − A起動ファイルの時刻 > 一定時間 Then
  「A」をリブート
  「A」の起動ファイル削除
 End If
 Sleep(3000)
 Doevents
Loop

突然ファイルの改名が出来なくなる現象の理由が分かりません。
※エラーログなどは出ていませんでした。
はじめはうまくいっていた事から、起動ファイル改名時に、ファイルが使用中に
なっているわけではないと思っております。
サーバの再起動もしたのですが、それでも、解決しなかったので、
今は「A」だけを動かしております。
なぜか、「A」だけならば正常に処理される。(改名も正常に行われる)
開発時に数日動かし続けた事もあり、単純な問題では
ないな〜と色々調べてはみたのですが、原因が分かりませんでした。

説明がヘタクソで分かり辛いかもしれませんが、原因に心あたりのある方、教えて下さい。
開発で再現すらしない状態です。こうしたら、再現するかも?的な事で大歓迎です。

※ちなみに、実際には「B」も起動ファイルを吐き出し、「C」のプログラムが「B」を監視。
 「B」も「C」を監視と少々ややこしい作りになっております。「A」を監視しているのは
 「B」だけです。

説明へたくそで、長くなってしまい申し訳ありません。

投稿時間:2006/05/29(Mon) 22:48
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: VBの常駐処理で、突然改名が不可能に・・・・
# 回答にあらず。

hhttp://www.microsoft.com/japan/developer/library/jpwinpf/_win32_sleep.htm
》 ウィンドウを作成するスレッドでは、Sleep 関数ではなく、MsgWaitForMultipleObjects または
》 MsgWaitForMultipleObjectsEx 関数を使ってください。

にもあるように、基本的に、VBでは Sleep を使うべきでは無かった様な気がします。
(Formを使っていない場合でも、VBは内部的にウィンドウを生成するため)

Sleep + DoEvents のかわりに、MsgWaitForMultipleObjects + DoEvents の方が良いかも。

投稿時間:2006/05/30(Tue) 09:15
投稿者名:MAKO
Eメール:
URL :
タイトル:
Re^2: VBの常駐処理で、突然改名が不可能に・・・・
さっそくの返信ありがとうございます。
> Sleep + DoEvents のかわりに、MsgWaitForMultipleObjects + DoEvents の方が良いかも。
そんなのがあったとは・・・
元々のコーディングがSleepを使用していたので、何も疑いもせず使用していました。
参考にさせて頂きます。

あと、大変申し訳ございません。
昨日調べ続けたところ、原因が判明いたしました。
終電間際だったため、解決しましたレスが遅くなり大変申し訳ございません。
原因は、プログラムの作りが悪い事から、改名ができないではなく、
そこまでいっていない事が判明しました。
ちょっと複雑な要因(仕様の問題)が絡むので、詳細は割愛させて頂きます。
何かしらの要因のため、改名が出来ないのだ。と固定観念のようなものがあり、
原因解明に時間が掛かってしまいました。

皆様大変ありがとうございました。
また、何か分からない事がありましたら教えて下さい。
私も、学んだ事をここで少しでもお役に立てれたらと思います。