すぐに制御を返す関数の実装って?

[戻る]
缶切り 2007/10/23(火) 21:38:49
API直叩きで四苦八苦しながらプログラム作りをやってる℃素人です・・
SDKのマニュアルを読んでいて時々思うんですが、API関数の中には呼び出し側にすぐに
制御を返してくるモノがありますよね。(処理が終わってから通知メッセージを送り返
してくるって感じで)
ああいう関数って内部ではどうやって処理してるんでしょうか?
C言語しか分からない未熟者で恐縮ですが、普通return文で戻り値を呼び出し側に返すと
同時に、その関数から抜けてしまいますよね。
自分もインターネット関連のプログラムを作ってる時に、そういう処理の仕方ができる
関数を作りたいなぁと思ったんですが、どうやって実装したらいいのか分かりません。
タイマーメッセージのようなものを使ってるんでしょうか?

しま 2007/10/23(火) 21:54:46
例え話です

そのAPIは電話を受け取りました(API呼び出し)
あなたの話が分かったらAPIは担当者に仕事を依頼します
分からなかったら分かりませんとか出来ませんとか返事して電話を切ります(失敗し
た)
依頼したらあなたにいいよと返事して電話を切ります(API呼び出し完了)

缶切り 2007/10/24(水) 00:10:22
でも依頼した仕事が戻ってくるまで、制御は返せないのでは?

たとえば

int 関数@(int 仕事の種類)
{
    if(仕事の種類 できる){
       関数A(仕事の種類) //専門の担当者 関数Aをよびだして処理させる
          return 1; //仕事を受け付けた
    }
    else
       return 0; //処理できなかった   
}

int 関数A(int 仕事の種類)
{
    仕事の処理・・・
    return 1;
}

このばあい、依頼された専門家の関数Aが処理を終えるまで、関数@は処理を返さない
と思うわけで・・・

wclrp ( 'o') 2007/10/24(水) 00:36:35
マルチスレッドでしょう。

話が長くなりすぎるのでマルチスレッドの解説はしないよ。

しま 2007/10/24(水) 02:52:14
>でも依頼した仕事が戻ってくるまで、制御は返せないのでは?


依頼するまでがAPIの役目だったら、依頼先の作業が終わるまでAPIが待つことはない
とは思いませんか?

>>API関数の中には呼び出し側にすぐに
>>制御を返してくるモノがありますよね
がどのAPIについてのことなのかわからないので敢えて例え話をしたわけですが
お気に召しませんでしたでしょうか?

PATIO 2007/10/24(水) 10:47:53
考えている範疇がシングルプロセスのシングルスレッドで考えているから
そうなってしまうのだと思います。
wclrp ( 'o')さんが書かれているようにマルチスレッドを使うとか
マルチプロセスを使って処理をする場合であれば、今の考え方から
抜け出せるのではないかと思います。
言語がCであってもマルチプロセスやマルチスレッドは可能ですから
言われているような処理をしたいと思うのであれば、
マルチスレッドやマルチプロセスの勉強をされてはどうでしょう?

CPUもマルチコア化してますし、マルチスレッドの技術は今後どんどん
有効になっていくと思います。

name 2007/10/26(金) 15:48:04
マルチプロセスやマルチスレッドを利用しない場合ですが。
そういう条件下では実行ユニットは一つです。
概念的に並列化したりということがあっても、実行ユニットは一つです。
それを踏まえてですね。
ウインドウズはデータ構造であるQueueに処理を溜め込むように出来ています。
ウインドウズのメッセージループを思い出してください。
GetMessage
でキューから読み出して、
TranslateMessage
DispatchMessage
これらが適切にメッセージIDとパラメータを設定してWndProcを呼び出すことでイベント
トリブンは動作します。

そういう感じで
Queueをforで舐めるとかキューイングすると言う動作は実際にその場で処理するよりも軽
いことが多いと言うことです。
でもどこかでその本道の処理をしないことには貴方の目的を達成することが出来ません。
そして、貴方はやっているはずです。

古いスレッドには追加発言できません。