VB初心者ですが宜しくお願いします。
VBで、マクロファイルを引数にして外部アプリケーションを起動するVBを作成しています。
ここまでは、すでにできていますが、この処理を複数回(10回位)繰り返すと連続起動になり、アプリケーション側かOSで処理が追いつかず、CPUが100%になってしまいます。
起動する外部アプリケーションは同じで、マクロファイルが違うので複数回起動する必要があります。
そこで、1回アプリケーションを起動したら、何秒か経ってから次の処理をするようにしたいのです。
メッセージボックスで処理を中断する方法もありますが、どうしても自動で次の処理にいかせたいので・・・。
どうか、宜しくお願いしますm(__)m
【開発環境】windowsXP VB6.0【外部アプリケーション】TERATARM
*TERATARM→wnidowsからunix環境に接続するのに使用
*マクロファイル→TERATARMのマクロファイルで、unix環境に接続し、コマンドを送るファイル
APIのSleep関数を使うか
timeGetTime関数を使ってシステム起動時間を取得して、
ループで一定期間停止されるとか…
私は次のような関数を自分で作っています。
引数に待ちたい時間をmsで設定します。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Sub Wait(TimeWaite As Long)
Dim TimeStart As Long
TimeStart = timeGetTime
Do
DoEvents
Loop While (timeGetTime - TimeStart < TimeWaite)
End Sub
蛇足ですが。。。
ループで待つとCPU100%になるし、
Sleepで待つとその間のイベントが遅れてあがる。
ループの中に20msec程度の短いSleepを入れるとか、
タイマーコントロールを使用するとか。。。
>ループで待つとCPU100%になるし
ループの一回ごとにDoEventsが入っていますので、バックグラウンド
の処理を落とすことはありません。実際リアルタイム処理に使っています、
ただし10分とか長時間待たせるとCPUが熱くなる可能性はあります。
5秒や10秒待つには全く問題は無いでしょう。
(やってみたことはありません、単純ループだけなら熱くならないかも)
心配なら、精度は落ちますがSleepを入れます。
SleepはSleep(1)で十分です。これでCPUの利用率は5%以下になります。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Wait(TimeWaite As Long)
Dim TimeStart As Long
TimeStart = timeGetTime
Do
DoEvents
Sleep (1)
Loop While (timeGetTime - TimeStart < TimeWaite)
End Sub
長いSleepやSleepだけの処理は、MSDNによると
>The Sleep function suspends the execution of the current
thread for a specified interval.
となっており、Sleepの間はそのスレッド内の処理がすべて止まります。
従って”blue line”さんの様に同じスレッドの処理待ちにはあまり
向かないと思います。
みなさん、いろいろとアドバイスしていただき有難うございます。
初心者ものなので、全ての話は理解できませんが、いろいろと試すことができそうです。
試しに、APIのSleep関数を1起動ごとに5秒間使いましたが、成功率は80%くらいでしょうか・・・。たまに、重複起動がうまく処理できずCPUが100%になってしまいますね。
また、上記にもあるとおり、Sleep関数ですと、バックグラウンドの処理も停止してしまいます。できるだけバックグラウンドの処理は停止させたくないので、ループで回す方法も試してみたいと思います。
ちなみに、今は、VBの中でマクロファイルがあるPATHを指定していますが、マクロファイルをVBのプロジェクトの中に組み込むというか、保存はできるのでしょうか?
同一の外部アプリケーションを複数回起動との事ですが、
起動→終了→起動→終了を繰り返したいのですか?
重複起動させたいのですか?
それによって処理が異なります。
今まで、重複起動としてアドバイスしてきましたが、
もし、前者であるならばWaitForSingleObjectで検索でもしてみてください。
さて、APIのSleep関数でも成功率80%という事で、
何か別の問題が起きている可能性が濃厚ですね。
#80%になる前は何%だったのか知りたいところですが。。。
処理を一時停止する方法として、
初心者という事と精度が必要ないという事を考慮に入れれば、
タイマーコントロールがいいよと言っておきます。
ちなみに、
精度を必要とし、CPUに負担をかけず、
バックグラウンド処理も問題なく行うには、
timeBeginPeriod、timeEndPeriod、timeSetEvent、timeKillEvent等
を使用するマルチメディアタイマーがオススメです。
ただ、AddressOfとかを使用したりするので初心者向きではありません。
>"ぴろあき"さん
外部アプリケーションの起動は重複起動です。
今のところ、"ねろ"さんのループ処理を使用して試しましたが問題なく起動することができました。
また、CPUが100%になってしまうのは、おそらく、外部アプリケーションか、そのマクロファイルによるものだと思います。マクロファイルには接続先IPや、ユーザIDも含まれているので、多少、複雑なのかもしれません・・・。
今後、本件に関して問題が生じても、今回のアドバイスを元に自分でいろいろと試して解決していきたいと思います。
この度は、"通りすがり"サン、"ねろ"サン、"ぴろあき"さん、アドバイスしていただき有難うございました。