[リストへもどる]
一括表示

投稿時間:2003/05/08(Thu) 11:13
投稿者名:西一
Eメール:
URL :
タイトル:
同じ処理を複数起動する方法
こんにちは、皆さん。

単純な質問かも知れませが、同じ処理を複数起動する方法について教えて下さい。

処理は"あるフォルダ"のファイルを監視するプログラムです。
(FindFirstChangeNotificationを使って監視しようかと思っています。)

"あるフォルダ"と言うのは実行環境に依って複数あります。(数は決められません)

現状、メインプログラムから監視プログラムを起動すると、ファイルの監視中はメインプログラム
も止まってしまいます。
これを、何とか止まらずに"あるフォルダ"分監視し続ける良い方法はないでしょうか?

メインプログラム終了時は全ての監視処理を終了します。

*----監視プログラム-------------------------------------------------------------------
Private Sub Surveillance(ImgFolder As String)
'ImgFolderは呼び元から受け渡されるフォルダ名x:\xxxx\xxx
  
  Dim NotificationHandele
  Dim bWaiting        As Boolean
  Dim ErrCode
  Dim lngResult
  
  Dim lngSTARTTick    As Long
  
  Dim strDcmFile      As String
  Const WAIT_OBJECT_0  As Long = 0
  
  Dim ImgFolder      As String
  'ImgFolder = "c:\&&Temp\#1"  '監視フォルダ()
  
  Set objFS = CreateObject("Scripting.FileSystemObject")
  '*** ファイル変更通知object のスタート
  NotificationHandele = FindFirstChangeNotification _
                       (pImgFolder, False, FILE_NOTIFY_CHANGE_FILE_NAME)
  
  If NotificationHandele = INVALID_HANDLE_VALUE Then    '関数エラーの場合
    ErrCode = GetLastError
    Call EndRTN(ErrCode) '*** 終了処理の実行
  End If
  
  bWaiting = True
  Do While bWaiting = True
    lngResult = WaitForSingleObject(NotificationHandele, INFINITE)
    
    If (lngResult = WAIT_OBJECT_0) Then             'ファイル作成を感知した場合
      strDcmFile = Dir$(pImgFolder & "\*.*")        'ファイル名の取得
      Call FileRegist    '****** 登録処理を実行
      FindNextChangeNotification  _
            (pImgFolder & NotificationHandele)      'ファイル変更通知object のリスタート
    End If
  Loop
  '*** 通知オブジェクトをクローズ
  FindCloseChangeNotification (NotificationHandele)

End Sub
*----監視プログラム-------------------------------------------------------------------
【理想】
+--------------+            +--------------+
| メイン       |<-----+---->|Aファルダ監視 |
+--------------+      |     +--------------+
                      |     +--------------+
                      +<--->|Bファルダ監視 |
                      |     +--------------+
                      |     +--------------+
                      +<--->|Cファルダ監視 |
                      :    +--------------+
           :      :
<--->:ファイルが作成されるとそのファイル名を取得。
メインプログラムではそのファイルを読んで処理を行ないます。

複数起動出来て、各々監視出るようにしたいです。

投稿時間:2003/05/08(Thu) 15:05
投稿者名:通りすがり
Eメール:
URL :
タイトル:
Re: 同じ処理を複数起動する方法
VBで並列処理を行いたいということですよね?

スレッドを起動すれば出来るのではないでしょうか。
ただ、VBのバージョンによってはスレッドを起こすことは
出来ません。


> こんにちは、皆さん。
>
> 単純な質問かも知れませが、同じ処理を複数起動する方法について教えて下さい。
>
> 処理は"あるフォルダ"のファイルを監視するプログラムです。
> (FindFirstChangeNotificationを使って監視しようかと思っています。)
>
> "あるフォルダ"と言うのは実行環境に依って複数あります。(数は決められません)
>
> 現状、メインプログラムから監視プログラムを起動すると、ファイルの監視中はメインプログラム
> も止まってしまいます。
> これを、何とか止まらずに"あるフォルダ"分監視し続ける良い方法はないでしょうか?
>
> メインプログラム終了時は全ての監視処理を終了します。
>
> *----監視プログラム-------------------------------------------------------------------
> Private Sub Surveillance(ImgFolder As String)
> 'ImgFolderは呼び元から受け渡されるフォルダ名x:\xxxx\xxx
>  
>   Dim NotificationHandele
>   Dim bWaiting        As Boolean
>   Dim ErrCode
>   Dim lngResult
>  
>   Dim lngSTARTTick    As Long
>  
>   Dim strDcmFile      As String
>   Const WAIT_OBJECT_0  As Long = 0
>  
>   Dim ImgFolder      As String
>   'ImgFolder = "c:\&&Temp\#1"  '監視フォルダ()
>  
>   Set objFS = CreateObject("Scripting.FileSystemObject")
>   '*** ファイル変更通知object のスタート
>   NotificationHandele = FindFirstChangeNotification _
>                        (pImgFolder, False, FILE_NOTIFY_CHANGE_FILE_NAME)
>  
>   If NotificationHandele = INVALID_HANDLE_VALUE Then    '関数エラーの場合
>     ErrCode = GetLastError
>     Call EndRTN(ErrCode) '*** 終了処理の実行
>   End If
>  
>   bWaiting = True
>   Do While bWaiting = True
>     lngResult = WaitForSingleObject(NotificationHandele, INFINITE)
>    
>     If (lngResult = WAIT_OBJECT_0) Then             'ファイル作成を感知した場合
>       strDcmFile = Dir$(pImgFolder & "\*.*")        'ファイル名の取得
>       Call FileRegist    '****** 登録処理を実行
>       FindNextChangeNotification  _
>             (pImgFolder & NotificationHandele)      'ファイル変更通知object のリスタート
>     End If
>   Loop
>   '*** 通知オブジェクトをクローズ
>   FindCloseChangeNotification (NotificationHandele)
>
> End Sub
> *----監視プログラム-------------------------------------------------------------------
> 【理想】
> +--------------+            +--------------+
> | メイン       |<-----+---->|Aファルダ監視 |
> +--------------+      |     +--------------+
>                       |     +--------------+
>                       +<--->|Bファルダ監視 |
>                       |     +--------------+
>                       |     +--------------+
>                       +<--->|Cファルダ監視 |
>                       :    +--------------+
>            :      :
> <--->:ファイルが作成されるとそのファイル名を取得。
> メインプログラムではそのファイルを読んで処理を行ないます。
>
> 複数起動出来て、各々監視出るようにしたいです。

投稿時間:2003/05/09(Fri) 12:47
投稿者名:西一
Eメール:
URL :
タイトル:
Re^2: 同じ処理を複数起動する方法
こんにちは、通りすがりさん。皆さん。
レスありがとう御座います。

 
> VBで並列処理を行いたいということですよね?
はい。その通りです。

>
> スレッドを起動すれば出来るのではないでしょうか。
スレッドの処理と言うのは今ひとつ理解出来ていませんが、何とか調べてみます。
調べきれなかったら又、質問するかもしれません。
その時は宜しくお願いします。

> ただ、VBのバージョンによってはスレッドを起こすことは
> 出来ません。
VBバージョンは6.0SP5です。

>
>

投稿時間:2003/05/09(Fri) 17:50
投稿者名:シャフト
Eメール:
URL :
タイトル:
Re^3: 同じ処理を複数起動する方法
あまり良い方法ではないのかもしれませんがタイマーを使用してみました。(100ms)
Command1(0),Command1(1),Command1(2),Command1(3)がフォルダtest1,test2,test3,test4
の監視を開始する為のボタンです。
Command2で監視を停止します。

Option Explicit
Private Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
Private Declare Function FindCloseChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
Private Const INVALID_HANDLE_VALUE = -1
Private Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1
Private Const WAIT_OBJECT_0  As Long = 0
Private bSurvey() As Boolean
Private NotificationHandle() As Long
Private Sub Command1_Click(Index As Integer)

    If Not bSurvey(Index%) Then
        NotificationHandle(Index%) = FindFirstChangeNotification("E:\software\test" & CStr(Index% + 1), False, FILE_NOTIFY_CHANGE_FILE_NAME)
        If NotificationHandle(Index%) = INVALID_HANDLE_VALUE Then
            Call MsgBox("Notificate Start Error")
            Exit Sub
        End If
        bSurvey(Index%) = True
    End If

End Sub
Private Sub Command2_Click()

    Dim i As Integer
    
    For i% = 0 To 3
        If bSurvey(i%) Then
            Call FindCloseChangeNotification(NotificationHandle(i%))
            bSurvey(i%) = False
        End If
    Next i%
    
End Sub
Private Sub Form_Load()

    ReDim bSurvey(3) As Boolean
    ReDim NotificationHandle(3) As Long
    Me.Timer1.Enabled = True
    
End Sub
Private Sub Timer1_Timer()

    Dim i As Integer
    Dim lRet As Long
    
    For i% = 0 To 3
        If bSurvey(i%) Then
            lRet& = WaitForSingleObject(NotificationHandle(i%), 0)
            If lRet& = WAIT_OBJECT_0 Then
                Call MsgBox("Notify!")
                Call FindNextChangeNotification(NotificationHandle(i%))
            End If
        End If
    Next i%

End Sub

投稿時間:2003/05/12(Mon) 11:50
投稿者名:西一
Eメール:
URL :
タイトル:
Re^4: 同じ処理を複数起動する方法
こんにちは、シャフトさん。皆さん。

サンプルプログラムありがとう御座います。
参考にさせて頂きます。
(只今、別件がありまして、試していませんが… (−∧−)スミマセン)

以上、ありがとう御座いました。