イベントドリブン型プログラムの説明とは?

このQ&Aのポイント
  • イベントドリブン型プログラムは、OSからManagerにイベントが飛んできて、各タスクの関数がコールされる仕組みです。
  • さらに、OSから各タスクのコールバック関数が呼ばれることもあります。
  • イベントとは、関数コールのことを指しています。
回答を見る
  • ベストアンサー

イベントドリブン(C言語)

イベントドリブン(C言語) こんにちわ、質問があります。 とあるイベントドリブン型のプログラムについて説明をされました。 ソフトはOS(元はハード)からManagerと言われる管理タスクにイベントが 飛んでいき、Managerから各タスクの関数がコールされる仕組みだそうでです。 また、それだけでなくOSから各タスクのコールバック(?)関数がコールされる事も あるそうです。 ◆質問 ここでいうイベントとは何なんでしょうか? 結局C言語なので、イベントと呼ばれているモノは関数コールなんでしょうか? C言語でイベントドリブン型プログラムを作成した事がある方、 自分ならこう作るぞという方、教えてください。

noname#150259
noname#150259

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

  • ベストアンサー
noname#115788
noname#115788
回答No.4

>ここでいうイベントとは何なんでしょうか? オペレーティングシステム(OS)からのお知らせ(通信)のことです。 OSの上で動作するアプリケーションは、OSに対して、 「こういう事(イベント)が発生したら教えてね」 と事前に登録をしておきます。マウスやキーボード等の入力の入力デバイスや、他のアプリケーションからのメッセージなどです。この登録した内容が発生してアプリケーションがOSからメッセージを受け取る事をイベントの発生といいます。 これらのイベントが発生しないと、自力では何もしないアプリケーションをイベントドリブン型といいます。 >結局C言語なので、イベントと呼ばれているモノは関数コールなんでしょうか? OSによります。アプリケーションの起動時に、 「このイベントが発生したらこの関数を呼んでね」 とOSに関数のアドレスを登録しておきます。この関数をコールバック・ハンドラ(関数)といいます。 アプリケーションの指定したイベントが発生すると、OSはイベントの内容を引数としたコールバック・ハンドラを起動します。Windowsなどはこのタイプです。コールバック・ハンドラからリターンするとOSに制御が戻ります。 それとは別に特定のシステムコールを、要求するイベントを引数にして起動すると、イベントが発生するまでOSに制御を移し、アプリケーションが休眠するタイプのOSもあります。イベントが発生するとスタックか、レジスタにイベントの内容を入れてシステムコールが戻ってきます。比較的小規模なシステムに多いと思います。

noname#150259
質問者

お礼

回答ありがとうございます。(ありがとうカツオくん) とても分かりやすい説明でした。 イベントドリブンなのに、mainから処理を想像していた 私が間違っていたようです。

その他の回答 (4)

回答No.5

windows関連のプログラムもmainではありませんが、winmainから始まるイベントドリブンのプログラムを組むことが出来ます。 嘘が書いてあることもありますが、「猫でも分かるプログラミング」の「Windows SDK編 第1部」の「イントロダクション」から「第4章 ウィンドウを作る その4」に記載されています。 基本は「GetMessage」関数(Win32api)をコールすると、自プロセスのメッセージキューにメッセージが投げられるまで待機します。 メッセージを受信すると、GetMessage関数から戻ってきて受信したメッセージに対応する処理を記載する事になります。 C言語やC++ではコールバックといっても結局は通常の関数コールにすぎません。 C++やC#等ではクラスライブラリ等を使用してコールバック関数を意識させない作り?となっている場合もあります。

noname#150259
質問者

お礼

回答ありがとうございます。 猫でも分かるプログラミングを買ってみます。

回答No.3

参考までに イベントドリブンという言葉は抽象的なので、あまり気にしないほうがよいです。 「こんな感じのものがイベントドリブンと言うのか」 という程度の認識でよろしい。 もとは、工場の生産ライン用に提供された某16ビットプロセッサの、 専用開発言語の宣伝用に作られた言葉ではないかと思います(70年代半ば)。 ちなみに、 某メーカのCOBOL言語、 それから、Delphiは、イベント変数を持っていまして、 プログラミングがやりやすくなっているようです。 UNIX系では、普通はシグナルという取り扱いですが、 POSIXThreadを使うときにイベント変数を使ったような??? (POSIXライブラリーで定義されている???) どの場合でも、イベント変数の使い方に関しては、 キッチリとしたノウハウがあるので、 そのときになったら、しっかり注意事項を 聞くしかないですな。

noname#150259
質問者

お礼

回答ありがとうございます。 私の悪い癖なのですが、一般的な単語であったにしても、 抽象的な表現をされると途端に分からなくなってしまうのです。 もう少し、勉強します。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

通常の定義では、「イベント」そのものはただの信号です。それに呼応して起動するイベントハンドラはもちろん関数ですが。 実装方式は、OSが絡むとなればほとんどがメッセージキュー方式でしょう。 ものすごーく端折って書くと以下のような流れのものです。 イベント発生 ↓発生メッセージ通知 メッセージハンドラ ↓メッセージに対応するイベントハンドラ起動 イベントハンドラ

参考URL:
http://ja.wikipedia.org/wiki/イベント_(プログラミング)
noname#150259
質問者

お礼

回答ありがとうございます。 結局は関数コールをするということですね。 メッセージキューを調べてみます。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

>ここでいうイベントとは何なんでしょうか? そのManagerとやらの仕様を確認してください。 >C言語でイベントドリブン型プログラムを作成した事がある方 Windowsアプリは全てイベントドリブンのプログラムです。

関連するQ&A

  • イベントドリブン型とは?

    「VBAはイベントドリブン型のプログラムだ」とよく聞きますが、 イベントドリブン型とはどういう意味でしょうか? 自分なりの解釈ですが 「イベントが発生した時にプログラムが実行される事」と言う意味であってますか?

  • C言語について。

    ここでいうC言語のモジュールとは、関数の事でしょうか?教えていただけると嬉しいです。以下の文章です。 C言語のプログラムは、通常いくつかの関数によって構成されています。この関数とは、1つの処理単位を表すものでモジュールともいいます。

  • WindowsAPIからC言語関数への代替について

    ウィンドウズOSのプログラムから、Linuxプログラムへ移植するにあたり、ウィンドウズプログラムで使用していたAPIをLinuxで使用可能な関数に変更しなければいけなく、「API/C言語関数・Linuxシステムコール対応表」のようなものを探しています。知っている方教えてください。

  • C言語について。

    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリこれは、 どういう意味でしょうか?分かりやすく教えていただけると幸いです。すみません。で、 以下のかぶくんまんさんの回答です。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247611941 で、 C言語におけるプログラミングとは「main関数を書くこと」に他ならない。なぜ「main関数を書く」ことがC言語におけるプログラミングに他ならないのかと言えば、それは偏に「C言語のコンパイラはmain関数を呼び出すプログラムを生成するから」です。それがmain関数を求めるので結果的にmain関数がリンクされ、そしてmain関数が求めるままに他の関数もリンクされていくわけです。 で、その「main関数を呼び出すプログラム」こそが、C言語における「スタートアップコード」。 という回答で、main関数以降は、プログラマが書くのですよね?プログラマが関数をリンクさせる様なプログラムを書くということでしょうか?教えていただけると幸いです。すみません。 という所が分かりません。教えていただけると幸いです。すみません。以下のURL https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12247932542

  • 乱数をC言語で

    乱数をC言語でプログラムしたいのですが、 rand関数を使わずに作らなきゃいけないという事なんですが 一度作ってはみたもののうまく乱数にできずに困っています できれば教えていただきたいです

  • C言語を始めようと考えている者です

    某国立大理学部数学科の1回生です 4月から2回生の講義でC言語の講義があります。 以下がその内容となります 授業の到達目標 (1) 2進整数の計算、浮動小数点数の計算ができる。 (2) コンピュータが計算を行う基本的な仕組みがわかる。 (3) (2)の内容を実際にC言語で確認できる。 (4) C言語で簡単な数学の問題を解くプログラムを書くことができる。 授業スケジュール 講義  1. 計算と計算機の歴史  2. 2進整数の計算  3. 補数の考え方  4. 浮動小数点数の計算  5. 基本的なデータ型  6. プログラムの条件分岐構造  7. 中間試験  8. プログラムの繰り返し構造I  9. プログラムの繰り返し構造II 10. 配列I 11. 配列II 12. 関数 13. 素数に関する問題を解くプログラム 14. 微積分に関する問題を解くプログラム 15. 学期末試験とその解説 僕は今まで全くC言語プログラミングをしたことがありません。 他の言語も同様です。 http://www.forest.impress.co.jp/library/software/gakucgengo/ このサイトに出ている文法を学ぶことができる開発環境はダウンロードしました。 卒業後はgoogleに就職したいので今のうちからC言語は学んでおきたいのですが 先ず、何を学べばよいのかわかりません… 「アルゴリズム」や、「コンピュータの計算の仕組み」などを学ぶ必要もあると思うのですが 何から手を付ければよいのでしょうか? 考えが煮詰まってしまっています。アドバイスなどお願い致します。 因みに、現在用いているOSはwindows7です。 もしよろしければ、C言語初心者が学び始めるにあたって力強い書籍、サイトなど ありましたら教えてください。 よろしくお願い致します。

  • C言語 関数の呼び出し関係について

    C言語を習い始めてから、1ヶ月も経っていないんですが、長いプログラム(1万行くらい)の読解という課題が出ました。 読解を円滑に進めていくためのコツとして、「関数の大まかな呼び出し関係」を調べればよい、と学びました。 そこで質問させてもらいたいのですが、「関数の呼び出し関係を調べる」とは、具体的にどういうことなんでしょうか?関数が関数を呼び出しているんですか?? もうひとつC言語について質問です。 今回与えられたプログラムは1万行くらいあるのですが、そのうちmain関数は50行くらいしかありません。 これって、残り9950行はすべて、main関数の動作のためにあるんですか?? 以上、初歩的な質問かもしれませんが、ご指導願います。

  • C言語についてどうしてもわからない疑問

    プログラミング初心者です。 C言語を勉強中に疑問に思ったことが2つあります。 まず1つ目。 C言語以外のプログラミング言語、例えばjavaとかC#とかjsとかpythonとかrubyとかPHPとか、には開発者にとって便利なライブラリとかフレームワーク(僕にはこの2つの明確な違いがわかりません。が、どちらも「開発者が定義しなくてもよい関数やオブジェクトの集合」という認識があります)がありますよね。 そのおかげで色んな人達がプログラミングし易くなりました。 ネット(はてぶのホットエントリとか)でも「馬鹿な俺がプログラミングを勉強して〇〇を作った」といった記事をよく目にします。 でも「C言語を使って」というのは聞いたことがありません。 そもそも、C言語はそいういったライブラリやフレームワークが少ないように感じます。 検索してもrailsとかjqueryのようなフレームワーク(ライブラリ?)は見つかりません。 これが無かったらプログラムなんて作れないのでは? しかし、世間にはC言語で作られたプログラムが多いのもまた事実。 C言語ではいったいどのように開発が行われているのか教えてください。 2つ目 unixとかlinuxといったOSはC言語で書かれている聞いたことがあります。 しかし、プログラムの開発は「コードを書く→コンパイル(→デバッグ)→実行」という流れですよね。 ではOSを開発するときに、そのコードをどうやってコンパイルするのでしょうか? コンパイラはOSの上に立っているとするなら、OSがない状態でコンパイラはどこに立てばいいのか。 そこがわかりません。 誰かこの2つの疑問に答えてください。 お願いします。

  • C言語からC++の関数をコールする方法について

    初めて質問させて頂きます。 質問は2つあります。 ●1つ目の質問です。 この度、C言語ベースのプログラムに、C++で作成した関数を使用することになりました。 方法としてextern等を駆使しつつ、ラッパー関数を使って対応しております。 そこで質問なのですが、この場合、ラッパー関数に使用するファイル形式はcppまたはcのどちらが正しいのでしょうか?(どちらでも動きました) ●2つ目の質問です。 Windows環境(vs2005)では無事、CからC++の関数を呼ぶことに成功はしました。 しかし、本当に動かしたいのはLinuxでの環境になります。 先程作成したラッパー関数のファイルとC++で作成した関数のファイルをライブラリ(soファイル)化したものを使用し、コンパイルとリンクは問題なく通すことに成功したのですが、 実行させてみると、Cの関数からラッパー関数をコールしているのは確実なのですが、ラッパー関数の処理を通らず、プログラムが止まってしまいます。 試しにラッパー関数の処理を「return 0;」だけにして実行させてみましたが現象は変わらずでした。 そのため、ラッパー関数を呼ぶための何かに問題があると思っています。 ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。 Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。

  • C言語の解読

    C言語は、まったく未経験でソフトだけは持っています。教えてgooで "OS" や "google" はC言語で書かれている。大概のプログラムはC言語で書ける。というので興味があります。しかし、今からC言語の仕事をする自信はありません。C言語で書かれているプログラムの内容を理解するにはどのくらい時間がかかるのでしょうか?どこかでOSのソースを見ることなどできないでしょうか?

専門家に質問してみよう