- PR -

ファイル監視:FileSystemWatcherクラス....

投稿者投稿内容
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-07-10 02:39
私は、サービスえお作ったことがないのでよく分からないんですが、
引用:

ふぁんさんの書き込み (2003-07-09 18:24) より:
ようやくサービス化した時に永遠に動きながら、CPU100%にならない方法を見つけました。

while(true);  の代わりに while (watcher.Equels("")==true) ;
まず、trueになることが無いので、永遠に監視することになると思いますし、
watcherに対する比較ですのでEventが発生する度に比較するだけだと思います。
一応私のところでは検証済みです。


これって本当ですか?
while (watcher.Equels("")==true) ; をなくしても同じではないですか?
どう見てもこの while に意味があるようには見えないんですが(^^;
「trueになることが無い」のであれば一度 false で評価されて
素通りするだけだと思いますが。
# でも検証したってことだし…?

私がサービスプログラムの動作を知らないのでなんともいえないんですが、
Main の最後で終了してしまうのであれば Jitta さんが書かれた方法が
自然だと思いますし、そもそもサービスは終了しないものなのであれば、
イベントだけ登録して後は何も要らないと思います。

あと、今回の話の本質とは全く関係ないですが、条件式で == true は
通常冗長です(なくていいです、あっても問題はありませんが)。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-07-10 02:47
ちなみにうまくいってるのは最初のとおりイベントを登録する物ですか?
それとも while 内で待つ方法ですか?
# どちらにしてもそれぞれちょっと引っかかりますが。
ふぁん
会議室デビュー日: 2003/05/20
投稿数: 9
投稿日時: 2003-07-10 08:22
経緯を説明すると
FTPで送って来たファイルを監視するwindowsサービスを作ったのですが、
while(true);で永続化したらCPUが100%なってしまった。
それで、while(true);に変わる永続で待ち続ける方法を探してました。
*while無しだと監視が永続しない。一回で終ってしまうのです。

引用:

なちゃさんの書き込み (2003-07-10 02:47) より:
ちなみにうまくいってるのは最初のとおりイベントを登録する物ですか?
それとも while 内で待つ方法ですか?
# どちらにしてもそれぞれちょっと引っかかりますが。


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-07-10 09:16
引用:

ふぁんさんの書き込み (2003-07-09 18:24) より:

while(true);  の代わりに while (watcher.Equels("")==true) ;
まず、trueになることが無いので、永遠に監視することになると思いますし、
watcherに対する比較ですのでEventが発生する度に比較するだけだと思います。
一応私のところでは検証済みです。


ふにゃぁ?
 『検証済み』というのは、「サービスを動かした。CPU消費は0。ファイル操作をするとイベント処理が動いた」ということでしょうか。残念ながら、それでは「動作の検証」にはなりますが、「ロジックの検証」にはなりません。
引用:

なちゃさんの書き込み (2003-07-10 02:39) より:

while (watcher.Equels("")==true) ; をなくしても同じではないですか?
どう見てもこの while に意味があるようには見えないんですが(^^;
「trueになることが無い」のであれば一度 false で評価されて
素通りするだけだと思いますが。


 私の机上検証も同じです。「false」で評価されて素通り、つまりそこで待っているわけではない。一度デバッガで動きを追ってみてください。
(Mainの最初にsleep(適当に大きな値)を入れ、実行後、プロセスにアタッチする)

 手元にある、以前作ったサービスプログラムを見ると、Main関数の最後に
System.ServiceProcess.ServiceBase.Run(ServicesToRun)
というのがありました。おそらく、こっちに入って冬眠しているのだと思いますよ。


私のプログラム:
 定時間隔でUNIXにリモートシェルコマンドを発行する
やっていること:
 コンストラクタでタイマイベントを設定
 Main関数はさわらず
 イベントハンドラでリモートシェルを実行
ふぁん
会議室デビュー日: 2003/05/20
投稿数: 9
投稿日時: 2003-07-10 11:30
実のprogramは
@winサービスから何種類のファイルを監視プログラムスレッドを動かす。(FTPファイルをずっと監視する必要がある)
AFTP受信したらEventをキャッチし、非同期でファイル分析スレッドを走らせファイルを分析しチェックファイル作成、結合、バックアップ処理を実行する。
wfcService ---->WatcherThread1-----> MergerThread
catch ftp files
---->WatcherThread2
”LOGに処理記録があるし、Aの処理が出来てましたので”と言うしかないが。。。。。
実のシステム開発ですので、これからも検証して行きたいと思います。
上の程度の動作確認は出来ましたが、
何でwhile (watcher.Equels("")==true) ; と言っても
開発に追われて理論的な根拠はあんまり考えないほうなので答えられなくて申し訳ございません。

いろいろありがとうございました。
マンキン
会議室デビュー日: 2003/03/23
投稿数: 1
投稿日時: 2007-06-19 19:28
古い記事に対する返信、恐れ入ります。

ふぁんさんの環境や挙動はよくわかりませんが、VS2005におけるWindowsサービスの「FileSystemWatcher」利用は、特に考慮せずとも永続化が行われます。

「FileSystemWatcher」を調査していて紛らわしい内容でしたので、追記させて頂きました。
turutosiya
常連さん
会議室デビュー日: 2003/06/10
投稿数: 49
お住まい・勤務地: 東京都
投稿日時: 2007-06-19 19:48
WaitHandle 使うのが良いと思います

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