A 回答 (4件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
DoEventsの効果を体感したいなら、フォームを作成し、
コマンドボタン1,2を添付図のようにフォームに張り付けてください。
そしてFormモジュールに以下のコードを記述してください。
----------------------------------------------
Option Explicit
Dim Flag As Boolean
Private Sub CommandButton1_Click()
Flag = True
MsgBox ("DoEvents試験です。CommandButton2をクリックすると終了します")
Do
DoEvents
'通常はここで何らかの処理を行うが、今回は試験なのでなにもしない。
Loop While (Flag = True)
MsgBox ("CommandButton2がクリックされました")
End Sub
Private Sub CommandButton2_Click()
Flag = False
End Sub
-----------------------------------------------
コマンドボタン1をクリックすると、
"DoEvents試験です。CommandButton2をクリックすると終了します"
が表示され、コマンドボタン2がクリックされるのを待つ状態になります。
コマンドボタン2がクリックされるとFlagがfalseに設定されるため、Do loopが終了し、
"CommandButton2がクリックされました"
が表示され、処理が終了します。
もし、DoEventsの行を削除なり、コメントアウトするなりして、DoEventsを無効にした場合、どうなるかというと
コマンドボタン2がクリックできなくなります。
いわゆるExcelが固まった状態になります。これは、Do loopでCPUを占有しているために
他の処理(コマンドボタン2をクリックすること)にCPU時間が割り当てられないからです。
(こうなるとExcelが固まっているので、タスクマネージャーでExcelを殺すしか手はありません)
これで、Doeventsは、他の処理が動けるようにする為の命令だということがわかります。
一般的には、以下のようになります。
①CPUを占有しがちなプロシージャがある。(例ではPrivate Sub CommandButton1_Click())
この処理が終了する為には(もしくは中断させる)、外部から終了条件を与える必要がある。(=FlagをTrueにする処理)
②外部から終了条件を与える処理は①の処理と並行して実行されることが前提である。
③その場合は、①と②が並行して動作可能になるようにするために、①へDoEventsを組み込む。
DoEvetnsが呼び出されると、OSはDoEventsを呼び出した処理以外に、実行待ちとなっている処理がないか調べます。
もし、実行待ちの処理がなければ、DoEvetnsから直ちに戻ります。
もし、実行待ちの処理があれば、その処理にCPU時間を割り当て、その処理を実行可能にします。そして、DoEvetnsから戻ります。
当然の話ですが、①のプロシージャが、外部から中断させる必要がない場合とか、何がしかの処理が完了すれば必ず終了することが
保障されているなら、わざわざ、DoEventsを組み込む必要はありません。
あなたが提示されたコードで言えば、以下のようになります。
FlagをFalseにする処理がどこかにあるはずです。(提示されたコードにはありませんが・・・)
そのFlagをFalseにする処理を並行に動作させるためにDoEventsがあります。
もし、DoEventsを削除して、Sub aを実行すると、Execlが固まった状態になります。
No.2
- 回答日時:
Windowsがノンプリエンプティブだったのは太古の昔、Windows3.1の頃までです。
95からはプリエンプティブマルチタスクに移行しています。なので本来ならばDoEventsなんてのは必要ないはずなんです。でもいまだに滅びずに残っているのはなぜか?それはループのプロセスなどでCPU時間を独占されるのを回避するためです。今回のような処理だと、CPUは総力を挙げてひたすら単純な比較処理を行っているわけですから、比較するものが多くて時間がかかる場合は他のプロセスに割り当てられるCPU時間が減ります。プリエンプティブなので他の処理が完全に止まったりはしませんけど、他の足を引っ張るのに十分な威力が長いループにはあるのです。
でもDoEventsっておまじないを入れておくと、そこで処理をいったんやめてCPUを開放するので、OSは「ああ、そこまで急ぎの処理じゃないのね」と判断して他の仕事を割り当ててくれます。結果、全体の処理が回りやすくなるわけです。
ただ、今のVB.NETではDoEventsはApplication.DoEvents()メソッドに置き換えられました。そのうえ、できるだけ使わないようにしてね、そんな横着しないできちんとマルチスレッド化しなさいよ、と言うのが推奨されています。
ありがとうございます。
2段落目
>PUは総力を挙げてひたすら単純な比較処理を行っているわけ
Q1. ここでいう「比較処理」とは
While (FLAG = True)
ということですね。
>プリエンプティブなので他の処理が完全に止まったりはしませんけど
Q.2 ここでいう「ほかの処理」というのはプログラム上の他の処理だけでなく、OSの処理も含むのでしょうか?
>でもDoEventsっておまじないを入れておくと、そこで処理をいったんやめてCPUを開放するので、OSは「ああ、そこまで急ぎの処理じゃないのね」と判断して他の仕事を割り当ててくれます。結果、全体の処理が回りやすくなるわけです。
Q.3 いったんやめてCPUを開放する、というのは、CPUが忙しくないときのみループ内を行うという解釈でよいですか?
Q.4 他の仕事を割り当てる、というのは、例えばコマンドボタンのクリックなどを示したSub bのことと考えてよいですか?
Q.5 全体の処理、というのはプログラム全体ということですか?それともパソコン全体、ということですか?
Q.6 元プログラムで、ループ内にDoEvents以外に何も書かれていないので、「急ぎの処理」も何も、やることないのでは、と思ってしまうのですが、元プログラムはどういう意味なのでしょう?
こんなところにつまづいております。
No.1
- 回答日時:
Windowsがプリエンプティブ・マルチタスクOSではなく、ノンプリエンプティブ・
マルチタスクOSである事により必要になる処理。
一定時間内に強制的に制御が移る、UNIXやLinux等のプリエンプティブ・マルチ
タスクOSと違い、Windowsではアプリケーション(タスク)側からOSに制御を返す
事で擬似的なマルチタスクを実現しています。
この場合、一つのタスクが処理を占有した場合、OSに処理が移らない事によって、
他のタスクもストップしてしまい、OS全体が停止した様な状態(無限ループが解除
されない場合は、そのまま処理停止)になります。
質問でのDoEvents文は、それを回避する為のWindows独自の用法です。
ありがとうございます。
それを回避する、のそれとは、なにを指しているのでしょうか?
できれば質問文や質問にあるプログラムに書かれている言葉で答えていただけると助かります。
osに返す、などという表現は、今までなんども見てきたのですが、、具体的に、このぷろぐらむで、なにをosに返すのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
DoEvents関数って何?
Visual Basic(VBA)
-
DoEventsが必要な理由について
Visual Basic(VBA)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
-
4
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
5
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
6
CloseとDisposeの違い
Visual Basic(VBA)
-
7
Excel VBA で処理中断(DoEvents)ができなくて困ってい
Visual Basic(VBA)
-
8
VB6 DoEventsの代わりは?
Visual Basic(VBA)
-
9
VBの「As String * 128」とは?
Visual Basic(VBA)
-
10
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
11
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
12
ExcelVBA実行後に時々落ちる
Visual Basic(VBA)
-
13
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
14
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
15
エラーになってないのにVBAが中断される
Excel(エクセル)
-
16
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
17
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
18
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
19
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
20
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBA マクロ 実行する度に...
-
「ご処理進めて頂きますようお...
-
DoEventsがやはり分からない
-
VBAでループ内で使う変数名を可...
-
エクセルで、日付を入力すると...
-
switch の範囲指定
-
JDBCでの大量データ検索でResul...
-
UMLでの例外処理
-
Loadイベント中にほかのイベン...
-
お家デートをしててハグを長い...
-
インタラクティブの反対語は?
-
Do~Loopした回数をカウントしたい
-
条件付きコンパイル: #IF 1 Th...
-
Excel VBAにて2つの処理を同時...
-
メルカリのメルカードで買い物...
-
findは動くがfindnextがマクロ...
-
月度は何て読みますか?
-
セルの値が0はクリアするマクロ
-
リョウ・・・量?料?
-
【Excel】特定の文字を含むセル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
メルカリのメルカードで買い物...
-
【Excel】特定の文字を含むセル...
-
DoEventsがやはり分からない
-
プログラミング言語についてc++...
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
switch の範囲指定
-
FFTの結果ついて
-
お家デートをしててハグを長い...
-
VBの質問#if 0 then ってどう...
-
findは動くがfindnextがマクロ...
-
離散時間フーリエ変換について
-
VB.NET Excelを読み込んでDataT...
-
インタラクティブの反対語は?
-
月度は何て読みますか?
-
リョウ・・・量?料?
-
Do~Loopした回数をカウントしたい
おすすめ情報
教科書やネットでいろいろな情報を読み、サンプルプログラムも試したのですが、まだわかっていないのでます。一般的な説明では、もう一つピンとこないので質問した次第です。どなたか、質問にあるプログラムの言葉を用いて説明をお願いします。
なお、私が使っているのは、VB6.0です。