時間がかかる処理をタイムアウトにするには?


tmkm  2006-08-18 07:24:36  No: 132809

いつもお世話になっています。
ネットワーク上のクライアント情報を集めるアプリを作っています。
WMIやAPIで情報を取得しているのですが、20台に1台くらい10秒ほどかかって処理が失敗します。しかも待っている間は応答無しになってしまいます。
DoEventsを入れてタイマーで監視をし、タイムアウトするようにはしているのですが、応答無しの間はタイムアウトも効きません。これをタイムアウトにする方法はないでしょうか?

もうひとつ質問なんですが、クライアントのOS、SPのバージョンを取得したいのですが、GetVersionExで取得できるかと思いますが、いくつかサンプルをみましたが、クライアントを指定しているものは見当たりませんでした。
どうすればリモート端末の情報を取得できるでしょうか?

開発環境はvisual  basic 6.0 です。


魔界の仮面弁士  2006-08-18 19:22:19  No: 132810

各クライアントの情報を捕らえるアプリと、それらの結果を収集して画面に表示するアプリを、
それぞれ別プロセスとして起動するというのはどうでしょう。

で、それらの VB アプリ間では、たとえば DDE (LinkPoke メソッド等)によって
情報を交換するように実装する、と。問題のタイムアウトに関しては、
LinkTimeout プロパティが使えるかも知れません。

さもなくば、クライアント情報を捕らえるアプリが、それらをログとして
ファイル等に書き溜めるようにしておき、画面表示用のアプリは、それらの
ファイルを定期的に読み込みなおすような仕組みにしてみるというのも手かも。

> クライアントのOS、SPのバージョンを取得したいのですが
Win32_OperatingSystem クラスを使うとか。
http://www.anchorsystems.co.jp/anchor/ashp/netmon/samples/wmi_os.html#Win32_OperatingSystem.htm

    Dim TargetPC As String
    Dim User As String
    Dim Password As String
    '  :
    '  :
    Dim OS As Object
    For Each OS In CreateObject("WbemScripting.SWbemLocator") _
            .ConnectServer(TargetPC, , User, Password) _
            .InstancesOf("Win32_OperatingSystem")
        Debug.Print TargetPC
        Debug.Print "  OS:="; OS.Caption
        'Debug.Print "  SP:="; OS.CSDVersion
        Debug.Print "  SP:="; OS.ServicePackMajorVersion;
        Debug.Print "."; OS.ServicePackMinorVersion
        Debug.Print "  Plus:="; OS.PlusVersionNumber
    Next


tmkm  2006-08-19 04:13:58  No: 132811

回答ありがとうございます。

LinkTimeoutは純粋にデータ受け渡しのタイムアウトじゃないかなと思うんですが。timeoutの時間が過ぎると処理を終わらせる分けではないような気がします。

Aというアプリで端末一覧を取得→Bに1台を渡す→Bで情報収集→Bから結果をAに。。。という流れですよね?

OSのバージョンはうまくいきそうです。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加