• ベストアンサー

Loopとフリーズ

数ヶ月前からVBを始め、プログラムを組んでいる者です。 VB6.0を使用しています。 I/0ボードを用いてロボットの信号を受け取れるような環境を作りました。 『Do Until~Loop』処理で、信号を監視させているのですが、 プログラムを実行させるとCPU=100%になり、フリーズします。 『Do Until~Loop』処理の代わりになるような処理はないでしょうか? 以下に少し詳しく書き込んでおきますので、 よろしくお願いします。 信号Aは1(ON)と0(OFF)のどちらかの信号を常に出しています。 (タイミングは機械が制御しています) 信号Bも1(ON)と0(OFF)のどちらかの信号を常に出しています。 (タイミングはランダムです) <目的> 信号Aが1のとき、信号Bの信号を受け取り、 信号Aが0のとき、信号Bの信号は受け取りません。 <アルゴリズム> (1)信号Aが1になるまで『Do Until~Loop』処理を行う  待機させる (2)信号Aが0になるまで『Do Until~Loop』処理を行う  その処理の中で、信号Bの信号を常に監視させる

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

監視にDo-Loop構文を使っても構いませんがWindowsのメッセージループを止めない工夫をするようにしましょう メッセージループとは ボタンのクリックやウィンドウの再描画などOSが処理している部分です ループ中に DoEventsめっそどを適宜実行するようにしてみましょう たとえば 10回ループを回ったら1回DoEventsを実行するようにするとか dim nCnt as Integer nCnt = 0 Do Until 終了条件  監視処理  nCnt = nCnt + 1  if nCnt > 10 then   DoEvents   nCnt = 0  end if loop といった具合です

rikky15060
質問者

お礼

どうもありがとうございました! おかげさまでプログラムも正常に動いてくれました。

その他の回答 (1)

回答No.2

↓に加えて、APIの"Sleep"で、適当に感覚をあけるといいかも知れません。

参考URL:
http://hp.vector.co.jp/authors/VA017795/vbuseful/sleep.htm
rikky15060
質問者

お礼

Sleepもとても便利な命令だなと感じました。 どうもありがとうございます!

関連するQ&A

  • 2重のDo~Loopは?

    Excel VBAですが、A列にデータが入っています。 A列のデータが変わるまで 処理1 を実行し、変われば 処理2 を実行する。データがなくなれば終了する方法が分りません。宜しくお願いします。 i = 2 Do Until Cells(i, 1) = "" Do Until Cells(i, 1) <> Cells(i - 1, 1) 処理1 Loop 処理2 Loop

  • Do..Loopステートメントの使い方について

    現在、入門書を画面で確認しながら ExcelVBAの勉強をしています。 Do...Loopで躓いてしまいました。 Do...Loopステートメントの種類は 条件を満たすまでループするもの Do Until...Loop(ループの前で条件判断) Do...Loop Until(ループの後で条件判断) 条件を満たす間はループするもの Do While...Loop(ループの前で条件判断) Do...Loop While(ループの後で条件判断) とあって、 例えば、A1からA7まで文字が入力されていて 空白のセルになるまで太文字にするとしたら、 ループの前に条件判断していると A1が空白だと処理はされず ループの後で条件判断すると A1が空白でも処理はされる とありました。 とすると、 条件判断はループ後にした方が良いと言う事なのでしょうか。 (空白でも処理してくれるので) 自分が処理したいものが ループ「後」にするのか又は ループ「前」にするのか どのように判断すれば良いのかと言うことと、 また、 条件を満たすUntil(まで)とWhile(間) どちらを使用すれば良いのかの判断方法もわかりません。 超初心者の質問内容で申し訳ありません。 VBAって面白いなぁと思い始めたところで なんとか理解したいので 教えていただけると大変助かります。 よろしくお願いします。

  • VB2005 Do Loopについて

    VB2005 でDo Loopを使用していますが、このDo Loop内の処理をしている時にイベント(例えばボタンをクリック)が発生した場合、その処理をしたいのですがどうすれば良いでしょうか? VB6の時は、DoEventsを使用していましたが、VB2005でも使用できるのでしょうか? ご存知の方がいらっしゃいましたら、教えて頂きたいのですが。 よろしくお願いします。

  • 【VB】セルが空になるまで処理を繰り返したい

    Excel VBAを使用してです。 列Aにデータがずらっと入っています。 そのデータを列Bに、 Do while ~loop か Do until ~loopを使って データが無くなるまでコピーするという処理を書きたいのです。 VB歴が浅いためひらめきません。よろしくお願いします。m(__)m

  • LOOP処理で処理の先頭に移動するには?

    数年ぶりにVBのプログラミングをする事になり超初心者状態のため稚拙な質問で申し訳ございません 以下のような感じでLOOP処理を作成しています。 DO UNTIL AAA.EOF チェックA チェックB チェックC  AAA.MOVENEXT LOOP 上記のような形で取得した内容をLOOPでまわし、 一レコードづつチェックをかけていくのですが、 たとえば、チェックBでエラーとなった段階で AAA.movenextして チェックcはスキップしLOOPの先頭に移動し 次レコードのチェックをチェックAから開始したいのですが、 このような場合どう記述するのでしょうか? EXIT DOでループ自体から抜けるやり方はありましたが、このように処理の 途中で以降の処理をスキップしてループの先頭に移動する 方法が見つかりませんでした。 どなたかご教授ください!!

  • Do~Loopステートメント

    Do~Loopステートメントで使わな方が良いステートメントとは? Do~Loopステートメントで「古いから使わない方がよい」、と言われたことがあるのですが どれの事だか忘れてしまいました。 Sub test() セルのA1~A10に1~10を入力する i = 1 Do While i < 11 Worksheets("Sheet1").Cells(i, 1).Value = i i = i + 1 Loop End Sub これは一般的だから使ってもよいと思います。 Sub test() セルのA1~A10に1~10を入力する i = 1 Do Until i = 11 Worksheets("Sheet1").Cells(i, 1).Value = i i = i + 1 Loop End Sub これもよく見かけます。 Do While,Do Until以外にもloopステートメントってありますか? あと使わない方が良いステートメント、私の勘違いでなければ教えてください。

  • ProgressBarを用いる場合、全体の処理数の求め方(Do Loop文に関して)。

    ProgressBarを用いる場合、全体の処理数を求めますが、Do Loopを用いる場合、For文と異なり必ずしもすぐに全処理数が分かるわけではありません。そのような場合、どのように全処理数を求めればよいですか? 私は、あるフォルダにあるファイルすべてを処理するプログラムを作りました。Do Loopで全てのファイルを参照し終わるまでをUntilの条件としています。したがって、いくつのファイルがあるかは分かりません。

  • Do loopのマクロ

    以下のマクロの問題点を教えていただきたいのです。 A列を上から順番に調べて、値が10のときだけBに分岐して処理を行い(処理の内容は省略してあります)、またAに戻って、空白のセルが見つかったら処理をやめる、というマクロです。 ところが、これを実行すると空白のセルが見つかってもマクロが止まりません。何が問題でしょうか。 Sub A() Cells(1, 1).Select A: Do Until ActiveCell.Value = "" If ActiveCell.Value = 10 Then GoTo B End If ActiveCell.Offset(1, 0).Select Loop B: ActiveCell.Offset(1, 0).Select GoTo A End Sub

  • マクロのプログラミングで Do Loopステートメントです

    明後日学校の情報の授業でエクセルのマクロを使ってプログラミングするんですが語句について教えてください エクセルのマクロなんですが Do Loopスタートメントって言うのをやります そこでコマンドの意味を教えてほしいんです 明後日なんでなるべく早くお願いします 今回のコマンド(と、バリエーション)って書いてあります 1) dim i as→ 2) Do While 条件式 処理 Loop 3) Do Until 条件式 処理 Loop 4) i=i+1 5)Integer この5つです お願いしますm(_ _)m

  • Loopの使い方について

    Rubyで 数字を下記のようなやり方では1~12 までの数字をまわせるプログラムと 文字のa~l までまわせるプログラムを合体させたいのですがどのようにすればよいでしょうか? #1-12 までの数値をまわすソース n=1 loop do puts n if n == 12 break end n += 1 end 実行結果↓ 1 2 3 4 5 6 7 8 9 10 11 12 # a~ lの小文字をまわすソース ["a","b","c","d","e","f","g","h","i","j","k","l"].each do |n| puts n end 実行結果 a b c d e f g h i j k l 上記のプログラムをあわせて、実行結果が、↓ 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j 11 k 12 l ↑ このようにするには、どのようにすればよいでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Ruby

専門家に質問してみよう