プロが教えるわが家の防犯対策術!

本来OSカテゴリに質問すべき内容なのかもしれませんが、Widows一般カテゴリが存在しないのでこちらで質問させていただきます。

このカテゴリの少し前の質問(https://oshiete.goo.ne.jp/qa/10423277.html)について
No.2さんの回答がよく理解できません

> 95からはプリエンプティブマルチタスクに移行しています。
> なので本来ならばDoEventsなんてのは必要ないはずなんです。

> でもいまだに滅びずに残っているのはなぜか?
> それはループのプロセスなどでCPU時間を独占されるのを回避するためです。

引用文の前半は理解できますが、後半の意味が不明です。
プリエンプティブマルチタスクであるならば、ループだろうが何だろうがOSが強制的に権限を奪って他のプロセス?に割り当てるのではないでしょうか?

なぜ、そうなっていないのでしょうか?
Excel VBAのつくりが古い(Windows 3.1の頃=ノンプリエンプティブな頃)の制限が未だに存在するといった様な理由なのでしょうか?

ご回答いただければ幸いです。

質問者からの補足コメント

  • Sub test()
    Do While True
    ' DoEvents
    Loop
    End Sub

    というマクロをExcelで動作させました。(Windows7 Excel2010)
    DoEventsがある場合、特に問題は発生せず(マクロの停止にタスクマネジャを使用しましたが)
    DoEventsがない場合、Excelの操作が不能、他のアプリは問題なさそう。

    つまり、Excelに割り当てられたプロセス(?)を無限ループが食いつぶしているとうことなのでしょうか。
    その為にDoEventsが必要ということ?
    プリエンプティブマルチタスクでも、プロセス(?)内までは関与できない?

    ということなのでしょうか。

      補足日時:2018/04/12 08:14

A 回答 (3件)

> ↑が間違っているからです。



というのは言葉通りではなくて、UNIXユーザー流の皮肉でしょうね。ほんとにノンプリエンプティブだと、OS巻き込んで死んじゃいますから…まあ今でもたまにはOSがありえない死に方をする場合もありますけど…

それはさておき、VB6のアプリケーションは全てシングルスレッドになります。なので以下のようなコードの場合、このアプリ内ではループの処理中には他のことが行えなくなり、ボタンのイベントに反応しなくなってしまいます(そもそもボタンが押せない)。また他のアプリにも若干影響します。

Sub ボタン押された処理
 :
End Sub

Sub ループの処理
 :
End Sub

そこで登場するのがDoEventsです。ループの中にDoEventsと書いておけば、このループに一瞬の隙きができるんですね。この隙きの間には他のイベントが受け付け可能で、ボタンのイベントも入り込めます。ただししょせんは隙きであり、発生は非同期的だから、ボタンを受け付けたり受け付けなかったりと安定しません。それをきれいに解消するには、コードをマルチスレッド化しなければなりません(VB6/VBAでは無理です)。

そもそもVB6は32bit化を果たしたVBであって、思想は16bitの時代と変わっていません。Integer整数型が16bit長という点がそれを物語っています。それを引き継いだVBAも同様です。つまり、マルチスレッド?なにそれおいしいの?な時代のものです。なのでDoEventsのような前時代的妥協が必要である、と。
    • good
    • 1
この回答へのお礼

プロセスとスレッドに違いについて検索しました、未だよくわかっていませんが…

とりあえず、ご回答いただいた内容と私が補足で確認した内容で、ある程度の理解はできたと思います。
ご回答ありがとうございました。

お礼日時:2018/04/12 19:10

> 95からはプリエンプティブマルチタスクに移行しています。


↑が間違っているからです。
Windows上でもMS-DOS用アプリケーション等の古いソフトを
動作させる為、プリエンプティブマルチタスクに移行できて
いないのです。

UNIXやLinuxでは、どんな長いループであってもそれがCPUを
独占する事はありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2018/04/12 19:10

>>プリエンプティブマルチタスクであるならば、ループだろうが何だろうがOSが強制的に権限を奪って他のプロセス?に割り当てるのではないでしょうか?



私もOSの動きについては、詳しくありませんので推測ですが・・。

たぶん、短時間であっても、ループ処理にCPUを独占されたら、その間にやってほしいことがあっても、すぐにやってもらえなくなるからではないでしょうか?
たとえば、キャンセルしたいのに、キーボード入力が処理されないとか、画面に数字を書きだしているはずなのに画面が更新されないとか・・・。

それがDoEventsを定期的に挟み込むことで、処理してもらえるようになるからでは?
    • good
    • 0
この回答へのお礼

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

> ループ処理にCPUを独占されたら、その間にやってほしいことがあっても、すぐにやってもらえなくなるからではないでしょうか?

そうならない仕組みがプリエンプティブマルチタスクだと考えたので、質問させていただきました。

お礼日時:2018/04/12 19:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A