CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

フォルダ監視

投稿日:2006年7月2日 更新日:

フォルダを常時監視しておいて、ファイルが放り込まれたら、

自動的にファイル変換してくれたらよいね。

なんていう話があった。

一週間という短い間に、対象ソフトは別で2件あった。

こいつぁ、なんとかせにゃー!

という意気込みで、調査してみた。

キーワードは、WindowsAPIの以下の関数。

FindFirstChangeNotification( )

「変更通知ハンドルを作成し、変更通知の初期フィルタ条件を設定します。

指定されたディレクトリやサブツリーで変更内容がフィルタ条件と一致すると、

変更通知ハンドルの待機状態が完了します。」(MSDNから引用)

以下の様な、サンプルプログラムを作ってみた。

// フォルダ監視開始

CString path( “c:\\work\\” );

HANDLE hFolder = FindFirstChangeNotification( path, FALSE, FILE_NOTIFY_CHANGE_SIZE );

if( hFolder == INVALID_HANDLE_VALUE )  // 失敗

  return;

while(1)

{

  DWORD ret = WaitForSingleObject( hFolder, 5000 );

  if( ret == WAIT_OBJECT_0 ) // 変更された

  {

    // データ変換実行

  }

  else if( ret == WAIT_TIMEOUT ) // タイムアウト

  {

    if( m_Stop ) // 終了ボタンが押された

      break;

  }

  else // 何やらエラー

    break;

  if( FindNextChangeNotification( hFolder ) == FALSE ) // 再手続き失敗

    break;

}

FindCloseChangeNotification( hFolder );

フォルダ監視処理とデータ変換処理の同期もしっかりとれる。

そして、タイムアウトを5秒としたのがミソだ。

一定時間ごとに終了の合図を確認しておかないと、

while(1)で永久ループになっちまう。

その終了合図は、ユーザーインターフェースから入力させる必要があるので、

スレッドを分けなきゃいけなくなる。

つまり、フォルダ監視処理を AfxBeginThread( )で、別スレッドにする必要があるね。

詳しくは、以前このブログに書いた記事が参考になるだろう。

マルチスレッド

// フォルダ監視終了

if( m_pThread ) // スレッド実行中

{

  m_Stop = TRUE;

  WaitForSingleObject( m_pThread->m_hThread, INFINITE ); // スレッドが終了するのを待つ

  delete m_pThread;

  m_pThread = NULL;

}

かねがね思っていたんだよね。

エクスプローラなんかで空のフォルダを表示しているときに、

外部からデータがコピーされたり作成されたりすると、

リアルタイムでポッっと現れるのは、どうやってやってるんだろうと。

どうやら、こんな監視処理をしてるんだな。

スレッドが絡むので、以前はハードルが高かったけど、

今では十分理解できるようになった。

うん、うん、成長したもんだな。

Vistaで64ビットアプリケーションが本格化してきたら、

マルチスレッドは必須のプログラミング技術になるだろうから、

今のうちにマスターしとかなきゃな!

-ソフト開発
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

いたちごっこ3

開発者の考えた対策は空しく敗れ、3度目の戦いが始まるところから話は始まります。 ●3度目のクラック 開発者の考えたトラップに、クラッカーは見事に”はまって”くれました。でも、依 …

PDFアレコレのソースコードをnoteで有料公開してみた

ブロガーのマネタイズとして一般的になってきたnote。 ただブログで記事を書いたところで、おいらのようなアラフィフサラリーマンじゃー課金してくれるわけがない。 なので、おいらの大きな武器であるプログラ …

Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(3)

vhdを手軽に圧縮できるPowerShellプログラムの決定版。 まずは、前回考えたことを振り返る。。 ps1内のvhdのファイルパスを自分で書き変えなきゃいけないのが難点だから、ps1と同じ場所にあ …

PDFアレコレにページ挿入機能を追加

PDFアレコレのページ挿入機能とちょっとした不具合修正。 Ver2.08 2020/5/6 ・ページ挿入に対応した。指定したページの前に、指定したPDFファイルまたは空白ページを挿入できる。指定ページ …

Teigha改めODAでDWGをDXFに変換するプログラムをつくってみよう!【Part.2】

Part.1ではあれこれと前提の話を書いたわけだが、今回は実際にVCのプロジェクトを作る準備をしてみよう。 1.ODAモジュールのダウンロード 2019 Update 2のKernelとDrawing …