tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルsleep関数の待機について
記事No13030
投稿日: 2008/09/10(Wed) 09:07
投稿者悩める子羊
はじめまして<(_ _)>

すみません、教えて頂きたい事があります。
私は、CADを使用して仕事をしております。
shell関数を使ってCADを起動させているのですが
ちょっと問題があります。
このCADなんですが、パソコンのスペック(CPU、メモリ)
やバージョンによって起動時間(秒)がまちまちです。
今は、sleep関数で時間(秒)を調整しています。

パソコンのスペックが高くバージョンが低いと起動が早い。
パソコンのスペックが低くバージョンが高いと起動が遅い。

要は、それぞれのパソコンで起動時間がまちまちなのです。
これですと、同じ内容でそのパソコンに合ったプログラムの
書き換えが必要で管理上すごく面倒です。
(コピーしてそれぞれのパソコン用のフォルダを作る)

そこで、一番の解決策としてshell関数を使ってCADを起動させて
起動し終わるまで待機して次の動作に行くにはどうすればいいでしょうか?

今はこんな感じです

'CADを起動
     ret = Shell("C:\Program Files\CAD\***.exe", vbMaximizedFocus)
     '4000ミリ秒待機させる(4秒)
     Sleep (4000) ← 「ここで調整」
  '次の処理

諸先輩の方々、御助言をお願い致します。

[ツリー表示へ]
タイトルRe: sleep関数の待機について
記事No13031
投稿日: 2008/09/10(Wed) 10:52
投稿者魔界の仮面弁士
> そこで、一番の解決策としてshell関数を使ってCADを起動させて
> 起動し終わるまで待機して次の動作に行くにはどうすればいいでしょうか?

WaitForInputIdle API で。

http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?mode=allread&no=8150&page=330
http://jeanne.wankuma.com/tips/vb6/process/waitforinputidle.html

[ツリー表示へ]
タイトルRe^2: sleep関数の待機について
記事No13032
投稿日: 2008/09/10(Wed) 15:41
投稿者悩める子羊
御助言ありがとうございます。
一応、ご指示頂いたURLの中身で一部引用しましたが私のスキルでは
エラーが出て先に進みません。下記のようにしましたが

' WaitForInputIdle 関数
Private Declare Function WaitForInputIdle Lib "USER32.DLL" ( _
    ByVal hProcess       As Long, _
    ByVal dwMilliseconds As Long  _
) As Long

Dim lProcessId As Long

'CADを起動
        lProcessId = CLng(Shell("C:\Program Files\CAD\***.exe",vbMaximizedFocus))
           Call WaitForInputIdleProcess(lProcessId)
  '次の処理

エラーが出まくりです。
二つのURLでは、中身がだいぶ違いますね!
お手上げです。(-_-;)

[ツリー表示へ]
タイトルRe^3: sleep関数の待機について
記事No13033
投稿日: 2008/09/10(Wed) 18:24
投稿者花ちゃん
そのまま使用すればよかったはずですが。

下記を貼り付けて、CAD のパスだけ書き換えて試して見て下さい。

Option Explicit

Private Declare Function OpenProcess Lib "kernel32" _
   (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Boolean, _
    ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
   (ByVal hObject As Long) As Long
Private Declare Function WaitForInputIdle Lib "user32" _
   (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
Private Const SYNCHRONIZE As Long = &H100000

Private Sub Command1_Click()
   Dim TaskID As Long
   Dim hProcess As Long
   Dim Ret      As Long
  
   TaskID = Shell("C:\Program Files\CAD\***.exe", vbMaximizedFocus)
  
   hProcess = OpenProcess(SYNCHRONIZE, False, TaskID)
   If hProcess = 0 Then
      MsgBox "ハンドルが取得できません"
      Exit Sub
   End If
   Ret = WaitForInputIdle(hProcess, &HFFFF)
   Call CloseHandle(hProcess)
   MsgBox "表示しました"
End Sub

[ツリー表示へ]
タイトルRe^4: sleep関数の待機について
記事No13034
投稿日: 2008/09/12(Fri) 10:35
投稿者悩める子羊
御助言有難う御座います。
>> Private Sub Command1_Click()
>    Dim TaskID As Long
>    Dim hProcess As Long
>    Dim Ret      As Long
>    
>    TaskID = Shell("C:\Program Files\CAD\***.exe", vbMaximizedFocus)
>    
>    hProcess = OpenProcess(SYNCHRONIZE, False, TaskID)
>    If hProcess = 0 Then
>       MsgBox "ハンドルが取得できません"
>       Exit Sub
>    End If
>    Ret = WaitForInputIdle(hProcess, &HFFFF)
>    Call CloseHandle(hProcess)
>    MsgBox "表示しました"
> End Sub
おっしゃる通りに記述して動かしました。
CADは、起動しましたが、その後の処理をしません。
CADを、起動待機させて後に「Sendkeys」を二行程、動かしたいのですが
全然、反応がありません。上のソースのどこに入れれば「Sendkeys」が
動くのでしょうか。宜しく、お願いします。

   【全文引用を避け、必要な部分のみを引用するようにして下さい。】

[ツリー表示へ]
タイトルRe^5: sleep関数の待機について
記事No13035
投稿日: 2008/09/12(Fri) 10:51
投稿者花ちゃん
> おっしゃる通りに記述して動かしました。
> CADは、起動しましたが、その後の処理をしません。
> CADを、起動待機させて後に「Sendkeys」を二行程、動かしたいのですが
> 全然、反応がありません。上のソースのどこに入れれば「Sendkeys」が
> 動くのでしょうか。宜しく、お願いします。

逆じゃないですか?
上記のコードをそのまま実行した結果はどうだったのですか?
メッセージボックスが画面の裏側にでも表示していませんか?
(メッセージボックスの表示時の 音 がしませんか)

又、どこへ、どのように書いたが動かなかったと貴方が書かないと。

MsgBox "表示しました" の部分を削除してそこに書いて見て下さい。

それと、このレスを見ているなら速やかにレスをするようにして下さい。

[ツリー表示へ]
タイトルRe^6: sleep関数の待機について
記事No13037
投稿日: 2008/09/12(Fri) 12:07
投稿者悩める子羊
すみません<(_ _)>
MsgBox "表示しました" は、出ました。音もしました。
こんな感じです。
Private Sub Command1_Click()
    On Error GoTo ErrorHand
    '処理開始
-----------------------------------

' ここに、処理構文があります  

-----------------------------------
    Dim TaskID As Long
    Dim hProcess As Long
    Dim Ret As Long
    
    '***CADを起動
     TaskID = Shell("C:\Program Files\***CAD\***.exe", vbMaximizedFocus)
    
      hProcess = OpenProcess(SYNCHRONIZE, False, TaskID)
   If hProcess = 0 Then
      MsgBox "ハンドルが取得できません"
   End If
   Ret = WaitForInputIdle(hProcess, &HFFFF)
   Call CloseHandle(hProcess)
  
   MsgBox "表示しました"
  
    '***CADをアクティブにします。
     AppActivate "***CAD"
    '3000ミリ秒待機させる(3秒)
     Sleep (2000)
    'コマンドラインに送信
     SendKeys "%T" & "R", True
     Sleep (2000)
     SendKeys "c:\temp\***.scr" & "%O", True
     Exit Sub
   ErrorHand:
     Exit Sub
  End Sub
です。
宜しく、お願いします<m(__)m>

[ツリー表示へ]
タイトルRe^7: sleep関数の待機について
記事No13040
投稿日: 2008/09/12(Fri) 13:09
投稿者花ちゃん
>      SendKeys "%T" & "R", True
>      Sleep (2000)
>      SendKeys "c:\temp\***.scr" & "%O", True

そもそも、ここは何をしようとされているのですか?

単にCADを起動時に保存してあるファイルを表示したいだけとかではないですよね。
(関連付け起動参照)

又は、ここの 他プロセスの連携 項を参照して下さい。

[ツリー表示へ]
タイトルRe^8: sleep関数の待機について
記事No13041
投稿日: 2008/09/12(Fri) 13:35
投稿者悩める子羊
> >      SendKeys "%T" & "R", True
> >      Sleep (2000)
> >      SendKeys "c:\temp\***.scr" & "%O", True
そもそも、このプログラムは印刷をスプリクトを使って印刷させるものです。
上のキーストロークでCAD起動後にctrl+TとRでスプリクトのダイアログが開き
c:\temp\***.scrをファイル名に書き込ましてctrl+Oで開かして印刷する仕組みに
なっています。shell関数より前の省略したところは、リストボックスにドラッグ&
ドロップしたファイルを入れれば、そのファイルのパスをc:\temp\***.scrに書き込む
用にしています。実行ボタンを押すとCADが起動してマウスの代わりにキーストロークで
自動かしただけです。
わかって頂けたでしょうか...
宜しく、お願いします。

[ツリー表示へ]
タイトルRe^9: sleep関数の待機について
記事No13042
投稿日: 2008/09/12(Fri) 14:17
投稿者花ちゃん
> わかって頂けたでしょうか...
     SendKeys "%T" & "R", True
     Sleep (2000)
     SendKeys "c:\temp\***.scr" & "%O", True

  この辺のコードを見たら...。

> 宜しく、お願いします。
何度も言うようですが、どこまで正常に動いてどこからうまく動かないとか。
何々をしたいがそのコードが解らないとか?

>MsgBox "表示しました" は、出ました。音もしました。
これにしたってどの時点で表示したのかが肝心な事で、CAD が表示されてから、表示
したのなら、当初の質問の要件は満たしている筈ですが。

SendKeys "%T" & "R", True  で、ダイアログが表示したのですか?

表示したのなら、SendKeys "c:\temp\***.scr" & "%O", True でパスは
書き込めたのですか?(書き込めても後の動作はどうなのか?) 

F8 キーで実行したらどうなったのですか?

早々とエラー処理をしているようですが、エラーは発生するのですか、
しているのですか?

上記のような事はご自分で調べられたのですか?
調べたのなら、その辺の事を説明して頂かないと。

[ツリー表示へ]
タイトルRe^10: sleep関数の待機について
記事No13043
投稿日: 2008/09/12(Fri) 16:38
投稿者悩める子羊
ご迷惑をお掛けしました。
私の説明や書き方が下手みたいで管理人さんがお怒りみたいですね...
私のような素人が書き込みするのは100万年早いですね
申し訳ありませんでした....
諦めます。お手数ですがこのレスは削除して頂けないでしょうか。
お願いします。

[ツリー表示へ]