• 締切済み

ソフト構造の呼び方

メインループで待機中、イベントが発生したらそれに対応する処理をその1回の ループで全て終わらせてしまうようなソフト構造を何と呼びますか? またそれとは逆に、イベントが発生したらそれに対応する処理を複数回のループ で終了させるような構造を何とよんだらいいでしょうか? (これが時分割ということですか?) それぞれの長所、短所もおしえてください。 よろしくお願いします。

  • 044128
  • お礼率65% (117/180)

みんなの回答

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.3

#1 です. >  (a)1回のループで全ての処理を終わらせる 方法 >   と >  (b)1回でなく、複数回に分けて全ての処理を終わらせる 方法 > の呼び名のことです。 複数のアプリケーションを短時間で切り替え,同じ優先度の処理を 順繰りに実行する場合,そのスケジューリングを OS が行っている のならば,#2 さんが書かれているようにラウンドロビンと言いますが, アプリケーションが自分で行う場合の名前は聞いたことがありません. (そういうプログラムを昔書いたことはありますが.) (a) 対 (b) の図式に近いものはバッチ処理と時分割処理 (Time Sharing) でしょうか.ただしこれも OS がスケジューリングを制御していることには 変わりありませんが. バッチ処理 (Wikipedia) http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86 タイムシェアリングシステム (Wikipedia) http://ja.wikipedia.org/wiki/%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B7%E3%82%A7%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0 > 例えば、重たい処理を1回のループで全て順番にやっていこうとすると、 >  処理A→処理B→処理C→・・ > と処理Cを行うときには、処理Aを行ってからかなりの時間が経過して > いる可能性がありますよね? > > なので、それぞれの処理を細かく分けて、 >  1回目のループ: 処理A-1→処理B-1→処理C-1→・・ >  2回目のループ: 処理A-2→処理B-2→処理C-2→・・ >  3回目のループ: 処理A-3→処理B-3→処理C-3→・・ > というように行わせたいのです。 リアルタイム性能を重視する場合,そういう処理の分け方をするのではなく, 「イベント発生から所定の時間内に終わらなければならない処理」と そうでない処理を分け,前者を優先度の高いタスクとして実行するのが 普通だと思います. また,リアルタイム OS では優先度を動的に変更する機能も持っています. たとえば本来優先度の低い処理Aが終わらないと優先度の高い処理Bを開始 できない場合,Aの優先度をBの優先度まで上げて早く終わらせます (優先度継承). リアルタイムシステム (Wikipedia) http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%A2%E3%83%AB%E5%87%A6%E7%90%86 優先度継承 (Wikipedia) http://ja.wikipedia.org/wiki/%E5%84%AA%E5%85%88%E5%BA%A6%E7%B6%99%E6%89%BF

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

複数のタスクを短い時間で切り替えて並行に実行する。アプリケーション自身でそういう制御を行う構造には名称はなかったと思いますが、OSで行うものではラウンドロビン・スケジューリングと言いますね。 このレベルだと、イベントがあったら対応する処理を一気に実行するのはFIFOスケジューリングでしょうか。 イベントによる割り込み・再スケジューリングがないとすると、どちらも処理中には次のイベントが処理できないという問題がありますね。 FIFOの長所は単純さです。余分な処理もないのでスループットは高いです。レスポンスは最悪ですけど。 ラウンドロビンはFIFOよりレスポンスは改善します。ただしプログラムの複雑化とオーバーヘッドが必要です。 特に各タスクをタイマ割込みで強制中断切替するのではなく、各タスクを分割して自発的に切替える(疑似マルチタスク)のなら、各タスクを適切な処理規模に分割して切り替え処理を呼び出す手間が掛かります。

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

> メインループで待機中、イベントが発生したらそれに対応する処理をその1回の > ループで全て終わらせてしまうようなソフト構造を何と呼びますか? イベント駆動型 (event-driven) プログラム. で,そのループはイベントループ. なお Windows の GUI アプリケーションでは,ほとんどのイベントは ウィンドウ・メッセージなので,メッセージ・ループと呼んでいます. "イベント駆動" で検索 http://www.google.co.jp/search?q=%22%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%22&sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-34,GGGL:ja イベント駆動とは 【イベントドリブン】 - 意味・解説 : IT用語辞典 http://e-words.jp/w/E382A4E38399E383B3E38388E9A786E58B95.html @IT:Insider's Computer Dictionary [イベント駆動] http://www.atmarkit.co.jp/icd/root/82/5783582.html イベント駆動型プログラミング (Wikipedia) http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0 メインループ (Wikipedia) http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%AB%E3%83%BC%E3%83%97 > またそれとは逆に、イベントが発生したらそれに対応する処理を複数回のループ > で終了させるような構造を何とよんだらいいでしょうか? あらかじめループ回数を決めて,というのは聞いたことがないけど, 1回で全部処理するには時間がかかりすぎるから分割したいとか, 必要な条件が整わないから処理を次回に持ち越したい,ということですか? > それぞれの長所、短所もおしえてください。 その2つを比較する趣旨がよくわからないんですが, 学校の課題か何かですか? OS の授業ですかね? だとすれば,プリエンプティブ (前者) 対ノンプリエンプティブ (後者) ということかなぁ? "ノンプリエンプティブ" で検索 http://www.google.co.jp/search?q=%22%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AA%E3%82%A8%E3%83%B3%E3%83%97%E3%83%86%E3%82%A3%E3%83%96%22&sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-34,GGGL:ja ノンプリエンプティブマルチタスクとは 【non-preemptive multitasking】 - 意味・解説 : IT用語辞典 http://e-words.jp/w/E3838EE383B3E38397E383AAE382A8E383B3E38397E38386E382A3E38396E3839EE383ABE38381E382BFE382B9E382AF.html マルチタスク (Wikipedia) http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BF%E3%82%B9%E3%82%AF

044128
質問者

補足

ご回答ありがとうございました。 すみません、ちょっと質問のポイントがずれていたかもしれません。 お聞きしたかったのは、  (a)1回のループで全ての処理を終わらせる 方法   と  (b)1回でなく、複数回に分けて全ての処理を終わらせる 方法 の呼び名のことです。 例えば、重たい処理を1回のループで全て順番にやっていこうとすると、  処理A→処理B→処理C→・・ と処理Cを行うときには、処理Aを行ってからかなりの時間が経過して いる可能性がありますよね? なので、それぞれの処理を細かく分けて、  1回目のループ: 処理A-1→処理B-1→処理C-1→・・  2回目のループ: 処理A-2→処理B-2→処理C-2→・・  3回目のループ: 処理A-3→処理B-3→処理C-3→・・ というように行わせたいのです。

関連するQ&A

  • WaitForMultipleObjectのイベントの処理について

    はじめまして。 現在.NET 2003環境のVC++にて開発を行っています。 そこで知恵をかして頂きたいのですが、 WaitForMultipeObjects関数で待機している場合、 引数で指定している複数のイベントオブジェクトが ほぼ同時にシグナル化した場合、イベントの取りこぼし が発生する場合ってあるのでしょうか。 <例> スレッドA     スレッドB      スレッドC           for(;;){ SetEvent([0])     res = WaitFor...  SetEvent([1])             SleepEx(100, FALSE);           } ・スレッドBが複数のイベントを待機 ・スレッドA、Cがイベント発行 ・この場合、A、Cでほぼ同時にイベントが発生された場合、  (1)A(またはC)発行のイベントを取りこぼす  (2)A(またはC)発行のイベントを処理したのち、   のこりのイベントを再度処理する(for(;;)でループしている為) 取りこぼしの可能性があるとしたら、対応方法もできれば 知りたいです。 以上、よろしくお願い致します。

  • CPU資源をなるべく消費しないでイベントを待機する

    こんにちは。 VC++2008Exressを使用して、以下のようなプログラムを作成したいと思います。 初心者で、どうやって作成すれば良いのか悩んでおります。 参考になるものなどありましたら、ご教授ください。 Windowsアプリケーション Win32API メッセージループ内でWaitForSingleObjectなどのイベントを待機する関数を使用して イベントを待つようにしたいのですが メッセージループ内でメッセージも待機できイベントも待機できるような方法はないでしょうか? 今のところ、実現はしておりませんが検討しているのは メッセージ待機用のスレッドを作成して、GetMessageで待機して メッセージがきたら、SetEvent関数でメインのメッセージループ内の WaitForSingleObjectを返す。 また、別のメッセージ以外のイベントを監視するスレッドを作成して WaitForSingleObjectで監視してイベントが来たら、さきと同じイベントを SetEvent関数を使用しメインのメッセージループ内のWaitForSingleObjectを返す。 という感じでメッセージとイベントをメッセージループ内で監視するようにするしか 分かりません。 その他、簡単な関数で実現可能なものなどありませんでしょうか? WaitForMultiObjectsとか、MsgWaitForMultiObjectsやら調べてみましたが、いまいち使い方が。。。。 また、スレッドは監視イベントが来るたびに終了させた方がよいのでしょうか? それでは、またスレッド作成を繰り返すので効率悪い気がします。 無限ループで監視させた方が良いのではと思いますが、CPU資源的には・・・。 というようなことで悩んでおります。 どうか、ご教授ください。よろしくお願いします。

  • スレッドの安全な終了のさせ方

    スレッドの安全な終了のさせ方  メインスレッドにてCreateThread命令を使い、あるサブスレッドを作りました。 このサブスレッドは内部でmallocを使い動的に配列領域を確保して その配列領域をforループ等で「かなり時間の掛かる処理」として繰り返し アクセスしています。 ループが終了した時に「free」を実行してmalloc領域を開放しています。 アプリ終了時にメインスレッドからこのサブスレッドを終了させるのに メインウインドウにWM_DESTROYメッセージが送られた時、これまで単に そこで「CloseHandle(hSubThread);」とだけ書いていたのですが、 もしかしたらこれでは場合によっては(サブスレッドがループ処理中だったら) malloc領域が開放されずにリークしてしまうのではないかと思いました。  そこでイベントオブジェクトを使い、サブスレッドがループ処理中の 時には非シグナル状態にして、ループが終了しfreeで領域を開放した後 シグナル状態にするということにして、メインスレッドはそれを WaitForSingleObjectで待つという構造にしました。 ところが「メインスレッドに待ちを作るな」という言葉通り、これでは 上手く行きませんでした。サブスレッドはその時間の掛かる処理の 最中でSendMassage等でメインスレッドの処理を促すような命令を (例えばその処理の進捗状況を表示するなど)を幾つも行っていたので、 もしWaitFor~でメインを待たせると「サブスレッドの処理も進まなくなり 結果両方がロックして動かなくなってしまう」という悲しい状況に 嵌ってしまうのです。 SendMessageを徹底的に無くすということも考えたのですが、 (例えばPostMessageに書き換えるなどもやってみたのですが、これは 全く意図した動作をしてくれない場合もあり)、別の方法では どうしても代替できないケースもあって、全て消すというのは 現実的ではないのかもと。。  このようなサブスレッドを安全に終了させるにはどうしたら良いでしょうか? あるいは単にデストロイ時にCloseHandleとするだけでも良いのでしょうか?

  • C#でスレッド実行中のイベントについて

    メインフォームの「処理開始ボタン」をクリックすると別スレッドが起動して、そのスレッド中で重たい処理をさせ、処理中に「中断ボタン」をクリックすると中断してアイドル状態に戻る様なプログラムについてですが、 先ず、Invokeを使わずに直接スレッドを起動すると期待通りの動作となり、Thread.Sleep()中でもボタンクリックのイベントが発生します。 しかし、Invokeとデリゲートを使ったスレッドを起動させるとスレッドの処理が終了するまでイベントが発生せず、行ったきり状態になってしまいます。 処理ループ内にAplication.DoEvent()を入れるとイベントが発生する様になりますが、Thread.Sleep()中はフリーズ状態となります。 Invokeを使ったスレッドでも、Invokeを使わない場合と同じ動作をさせる方法があれば教えて頂けないでしょうか。 どうぞ宜しくお願いします。

  • for文実行中を途中で中断するには?

    質問させてください! 例えば作成したアプリケーションのウインドウ上に、ボタンAとボタンBがあります。 そしてそのボタンAを押した時(イベントAが起きたとき)に、 for文が10000回ループするというプログラムがあるとします。 しかし、その10000回ループしている過程でウインドウ上のBボタンを押した時(イベントBが発生)すぐに、そのループを中断してイベントBが起きたときに起こる別のプログラムを流したいのです。 現実は、10000回ループし終えるまで、ボタンBを押してもイベントBは起きることはありません。 10000回ループし終えてから、ボタンBを押した時に発生するイベントBが発生します。 for文のループをボタンBを押した時実行途中でも終了して、イベントA用に書いたプログラムを中断させ、その直後イベントBが起きた時用に書いたプログラムを流すようにしたいのですが、 プログラム初心者なものでよくわかりません。 どなたかご教授お願いいただけないでしょうか?!

  • VC++ メインループでのイベント監視方法

    こんにちは。 VC++2008Expressでプログラムをしようと思っている初心者です。 以下、変な疑問があり、お尋ねしたいと思います。 よろしくお願いします。 Windowsアプリケーション Win32API クラスで別スレッドを作成して、そのスレッドからのイベントを WinMainループで受け取る方法ですが 通常皆様はどういう風にするのでしょうか? クラスは、その他のプログラムでも流用可能で様々なアプリに対応しやすいようにしあげたいのですが。。 別スレッドでイベント発生時にWinMainにどのように教えるのが普通のやり方なんでしょうか? 僕の考えでは、WinMain関数内のループ内で常時イベント発生していないか 以下のように監視させるか eventloop el; while(GetMessage(&msg,NULL,0,0)) {   TranslateMessage(&msg);   DispatchMessage(&msg);      if(el::boolEvent){     イベント処理へ   } } とするのが良いか? これだとクラスの関数、変数の使い方さえ分かるようにしておけば流用は簡単 なのかなと思いますが。。 メインのループ内にこんな監視を入れるようなプログラムをみたことないので ナンセンスなのではと思います。 次に考えられるのは、クラスのイベント発生で作成したSendMessageを送って メッセージ処理でイベント処理をさせるのが良いのかなって思いますが これだと、流用するときに対応したMessage(キュー?ですかね)を作成しないといけなく 私的に分かりにくいなーって思います。。。 変なことで悩んで先に進まないのですが、皆様はどのようにコーディングされるのでしょうか? ちなみにイベントというのは、RS232Cで受信があって、そのデータを加工したあとで メモリに格納して格納しましたよってイベントです。 どうかよろしくお願いします。

  • イベントの取りこぼしについて

    教えて下さい。 VBで構築したアプリケーションにおいて、無限ループ内で処理を判断し、実行するようなプログラム構築にしています。この無限ループ内に「DoEvents」をセットしています。これによりOSに溜まっている、各イベントを処理していると思うのですが、処理するイベントに取りこぼしは発生しないのでしょうか? 現在、A/Dボードを実装しており、2ms周期でVBのイベントが発生するようなソフトになっています。「DoEvents」実行時に、OS側が処理に要する時間は、キューに溜まっているイベント数×1回のイベント処理時間で単純に導けるものでしょうか? また、CPUのスペックを2倍にすると、単純に処理時間は半分と計算できるものでしょうか?

  • ループを使わずに、特定時間にイベントを発生させたい

    VC2005で、MFCアプリを作成しています。 ループを使わずに、ある指定時間もしくは、1時間後など設定した時間にイベントが発生し、その中で処理を入れる(例えば、時間が来ましたなどのメッセージ)を表示させるプログラムが書きたいです。 一回だけで終わるのではなく、イベント発生後、今度は2時間後にイベントを発生させるようなこともしたいです。 何かわかりやすいサンプルでもありましたら、助かります。

  • イベントの発生を待つ

    現在、テキストボックスへの文字入力を待つプログラムを作っております。 Form.Load()によって呼び出されるプロシージャの中で、フォームのテキストボックスへのキーの入力があるまで待機するプログラムとなっております。 方針としては、まずBoolean型のフラグを用意し、まずTextBoxのKeyPressイベントでこのフラグをオンにし、メインのプロシージャでは必要個所でDoループを回してこのフラグを確認し、オンになっていたらオフにしてループを抜け出すというプログラムです。 このループの中にSleep()関数を入れたりしても、ループのところでアプリケーションがフリーズしてしまいます。(ブレークポイントなどで確認しました) もっと効率のよい方法をご存知でしたらご伝授ください。 (KeyPressイベントの中に直接処理を書けばいいじゃないか、とおっしゃるかもしれませんが、今回はあくまでメインプロセスから読む必要があったため、質問をさせていただきました。)

  • イベントハンドラ処理が終了しているかどうかを確認するには?

    イベントハンドラ処理が終了しているかどうかを確認するには? 前回以下のページにて「c#でボタンのアクションが終わった後に再度同じ動作をさせるには?」 という質問をしました所、イベントハンドラ処理が終了していないのでは?という回答を頂きました。 http://okwave.jp/qa/q5833308.html しかし、残念ながら当方初心者の為、 デバッガを利用して 「LoadData()処理」や「ボタンのClickイベントに対応付けしたイベントハンドラ処理」が  ・ちゃんと最後まで終了しているか  ・無限ループに陥っていないか  ・IO入力待ちで止まっていないか というのをどのように確認してよいかすらわかりません。 どうすれば確認できるのでしょうか? 何か参考になるページなどでも結構ですので教えてください。 よろしくお願いします。

専門家に質問してみよう