
本来OSカテゴリに質問すべき内容なのかもしれませんが、Widows一般カテゴリが存在しないのでこちらで質問させていただきます。
このカテゴリの少し前の質問(https://oshiete.goo.ne.jp/qa/10423277.html)について
No.2さんの回答がよく理解できません
> 95からはプリエンプティブマルチタスクに移行しています。
> なので本来ならばDoEventsなんてのは必要ないはずなんです。
> でもいまだに滅びずに残っているのはなぜか?
> それはループのプロセスなどでCPU時間を独占されるのを回避するためです。
引用文の前半は理解できますが、後半の意味が不明です。
プリエンプティブマルチタスクであるならば、ループだろうが何だろうがOSが強制的に権限を奪って他のプロセス?に割り当てるのではないでしょうか?
なぜ、そうなっていないのでしょうか?
Excel VBAのつくりが古い(Windows 3.1の頃=ノンプリエンプティブな頃)の制限が未だに存在するといった様な理由なのでしょうか?
ご回答いただければ幸いです。

No.3ベストアンサー
- 回答日時:
> ↑が間違っているからです。
というのは言葉通りではなくて、UNIXユーザー流の皮肉でしょうね。ほんとにノンプリエンプティブだと、OS巻き込んで死んじゃいますから…まあ今でもたまにはOSがありえない死に方をする場合もありますけど…
それはさておき、VB6のアプリケーションは全てシングルスレッドになります。なので以下のようなコードの場合、このアプリ内ではループの処理中には他のことが行えなくなり、ボタンのイベントに反応しなくなってしまいます(そもそもボタンが押せない)。また他のアプリにも若干影響します。
Sub ボタン押された処理
:
End Sub
Sub ループの処理
:
End Sub
そこで登場するのがDoEventsです。ループの中にDoEventsと書いておけば、このループに一瞬の隙きができるんですね。この隙きの間には他のイベントが受け付け可能で、ボタンのイベントも入り込めます。ただししょせんは隙きであり、発生は非同期的だから、ボタンを受け付けたり受け付けなかったりと安定しません。それをきれいに解消するには、コードをマルチスレッド化しなければなりません(VB6/VBAでは無理です)。
そもそもVB6は32bit化を果たしたVBであって、思想は16bitの時代と変わっていません。Integer整数型が16bit長という点がそれを物語っています。それを引き継いだVBAも同様です。つまり、マルチスレッド?なにそれおいしいの?な時代のものです。なのでDoEventsのような前時代的妥協が必要である、と。
プロセスとスレッドに違いについて検索しました、未だよくわかっていませんが…
とりあえず、ご回答いただいた内容と私が補足で確認した内容で、ある程度の理解はできたと思います。
ご回答ありがとうございました。
No.2
- 回答日時:
> 95からはプリエンプティブマルチタスクに移行しています。
↑が間違っているからです。
Windows上でもMS-DOS用アプリケーション等の古いソフトを
動作させる為、プリエンプティブマルチタスクに移行できて
いないのです。
UNIXやLinuxでは、どんな長いループであってもそれがCPUを
独占する事はありません。
No.1
- 回答日時:
>>プリエンプティブマルチタスクであるならば、ループだろうが何だろうがOSが強制的に権限を奪って他のプロセス?に割り当てるのではないでしょうか?
私もOSの動きについては、詳しくありませんので推測ですが・・。
たぶん、短時間であっても、ループ処理にCPUを独占されたら、その間にやってほしいことがあっても、すぐにやってもらえなくなるからではないでしょうか?
たとえば、キャンセルしたいのに、キーボード入力が処理されないとか、画面に数字を書きだしているはずなのに画面が更新されないとか・・・。
それがDoEventsを定期的に挟み込むことで、処理してもらえるようになるからでは?
ご回答ありがとうございました。
> ループ処理にCPUを独占されたら、その間にやってほしいことがあっても、すぐにやってもらえなくなるからではないでしょうか?
そうならない仕組みがプリエンプティブマルチタスクだと考えたので、質問させていただきました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 弁護士・行政書士・司法書士・社会保険労務士 ★行政書士試験の民法についての質問になります。 物権変動についての質問になります。 問 不動産の取得 1 2023/05/24 19:36
- 日本語 自分の求める回答をしてもらえない原因は?(+教えてgooの使い方について) 16 2022/04/24 13:26
- 事件・犯罪 刑法についてです 2 2022/06/04 03:11
- 教えて!goo ベストアンサー表示なのに回答受付中 4 2023/06/17 18:48
- 図書館情報学 著作権について(再質問で申し訳ありません) 1 2022/09/16 23:32
- 哲学 物質創造 2 2023/05/17 20:29
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 弁護士・行政書士・司法書士・社会保険労務士 ★行政書士試験の民法についての質問になります。 代理での問題で分からない事があります。 問 建物を購 2 2023/05/18 22:06
- 教えて!goo 「教えて!goo」の機能として、 任意に語句を設定することにより、質問や回答の表示制限ができる機能が 7 2022/09/04 07:20
- 文学・小説 「羊たちの沈黙」を読んだことがある方に質問です 6 2022/06/02 00:10
このQ&Aを見た人はこんなQ&Aも見ています
-
DoEventsがやはり分からない
Visual Basic(VBA)
-
EXCELのVBAで作業ファイルを閉じてもメモリの解放をしなくて困っています
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
-
4
vbaのエラー対応(実行時エラー7:メモリが不足しています)
Visual Basic(VBA)
-
5
Excel VBA で処理中断(DoEvents)ができなくて困ってい
Visual Basic(VBA)
-
6
VBAの配列サイズとメモリに関して
Visual Basic(VBA)
-
7
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
8
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
9
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
10
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
11
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
12
VBA public変数はどのようなことをしたら解放されますか?
Visual Basic(VBA)
-
13
DoEvents関数って何?
Visual Basic(VBA)
-
14
メモリが不足しています(VBA)
Visual Basic(VBA)
-
15
配列をEraseしてもメモリが開放されていない?
Visual Basic(VBA)
-
16
vba クリップボードクリアについて教えてください
その他(プログラミング・Web制作)
-
17
メモリの解放の仕方
Visual Basic(VBA)
-
18
ExcelのVBAでメモリ解放できない
Visual Basic(VBA)
-
19
エクセル キャッシュメモリーの解放
Visual Basic(VBA)
-
20
Excel VBA 処理後データが重たくなる&処理スピードが遅いのを解決したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
範囲指定したセルを1つずつ飛...
-
Escキーを押すと、中断する時と...
-
スプレッドシート GASの繰り返...
-
なぜⅰなのか?
-
excel2000のVBAでループ内で...
-
VBAでln関数の計算
-
GIFアニメをループさせたくない
-
乱数の桁数指定、または範囲指定。
-
VBA for i=1 to lastrow
-
別窓を開くと親窓のGIFアニ...
-
csh foreachで「*」でエラ...
-
Javaでゲーム
-
ListBox 複数選択 で オートフ...
-
CSVファイルの特定の行だけを読...
-
vb.netです。2次元配列の要素を...
-
for (i = N - 1; i >= 0; i--) ...
-
ループ利尿薬について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UWSCの終了の仕方
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
範囲指定したセルを1つずつ飛...
-
vb.netです。2次元配列の要素を...
-
VBAで3秒だけ時間を止めたい
-
エクセルの当番表を作っていま...
-
UWSCに制限時間を付けたいです
-
DOSコマンドのループ内のTIMEコ...
-
VBAでの一時停止と再開の方法
-
CSVファイルの特定の行だけを読...
-
DoEventsが必要な理由について
-
GIFアニメをループさせたくない
-
VBA for i=1 to lastrow
-
Do whileでExitせず、ループの...
-
VBA Boxが空白の場合のメッセー...
-
vb.netからエクセル関数書き込み
-
イベントの発生を待つ
-
乱数の桁数指定、または範囲指定。
-
エクセル関数で1〜12の数字がル...
おすすめ情報
Sub test()
Do While True
' DoEvents
Loop
End Sub
というマクロをExcelで動作させました。(Windows7 Excel2010)
DoEventsがある場合、特に問題は発生せず(マクロの停止にタスクマネジャを使用しましたが)
DoEventsがない場合、Excelの操作が不能、他のアプリは問題なさそう。
つまり、Excelに割り当てられたプロセス(?)を無限ループが食いつぶしているとうことなのでしょうか。
その為にDoEventsが必要ということ?
プリエンプティブマルチタスクでも、プロセス(?)内までは関与できない?
ということなのでしょうか。