- ベストアンサー
デバイスコンテキストについて詳しく教えてください
C言語でwin32APIを勉強しているのですが、デバイスコンテキストとは具体的にどのようなものでしょうか?Windowsが管理しているGDIで描画をするための構造体らしいですが・・・。 それともう1つ質問です。解説サイトに「デバイスコンテキストは使ったらすぐ解放しなければならない」と書かれているのですが、なぜすぐに解放しなければならないのですか?サンプルプログラムを見ていると、まだ使えそうなデバイスコンテキストもすぐ解放し、次に必要になれば新たにデバイスコンテキストを確保していますが、そのまま取って置くのは駄目なのでしょうか。そのようなプログラム(汎用的なデバイスコンテキストをWinMainの最初に確保し、完全に使わなくなった時点で解放する)を作って動作させてみても、ぱっと見では問題が見つかりません。ですがこれではやはり問題があるのでしょうか? 質問は以上の2点です。回答よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>そのまま取って置くのは駄目なのでしょうか。 駄目です。 「同時に存在できるDCの個数」と「DCの生存期間」を考えて下さい。 Windowsでは「同時に存在できるDCの個数」は「256個くらい」です。 >汎用的なデバイスコンテキストをWinMainの最初に確保し、完全に使わなくなった時点で解放する このプログラムを複数起動すると、たぶん、220個目辺りで「DCが確保出来ない」というエラーが起きます。 「同時に存在できるDCの個数が256個」では「何が問題なのか、よく判らない」と思うので「同時に存在できるDCの個数が4個」で考えて見ましょう。 「起動直後にDCを確保して、終了直前に開放するプログラム」は、4つしか同時に起動する事は出来ません。5つ目を起動すると「DCの確保に失敗」してしまいます。 しかし「使う瞬間のみDCを確保して、すぐに開放するプログラム」は、4つでも5つでも6つでも、メモリが許す限り起動出来ます。 何故なら「使う瞬間のみDCを確保してすぐに開放する、という処理が、5つ以上同時に完全に同じタイミングで起きる事は、滅多にない」からです。 同時に起きたとしても、せいぜい3つくらいでしょう。4つ同時に起きるとは思えませんし、5つ同時発生するとすれば「ユーザーが、故意にそうなる操作をした」くらいでしょう。 _を「まだ起動してない期間」、□を「DCを確保してない期間」、■を「DCを確保している期間」、×を「DCを確保しようとして失敗した時」として、グラフにしてみると良く判るでしょう。 ・最初に確保して保持しっ放しのプログラム プロセス1:□■■■■■■■■■■■■■■■■■■■■■■■■■ プロセス2:__□■■■■■■■■■■■■■■■■■■■■■■■ プロセス3:___□■■■■■■■■■■■■■■■■■■■■■■ プロセス4:_____□■■■■■■■■■■■■■■■■■■■■ プロセス5:_______□× プロセス6:________□× プロセス7:__________□× プロセス8:_____________□× (以下略) ・必要な時だけ確保してすぐ開放するプログラム プロセス1:□■□□□□□□■□□□■□□■□□□□■□□□□□ プロセス2:__□■□□□□□□■□□□■□□■□□□□■□□□ プロセス3:___□■□□□□□□■□□□■□□■□□□□■□□ プロセス4:_____□■□□□□□□■□□□■□□■□□□□■ プロセス5:_______□■□□□□□□■□□□■□□■□□□ プロセス6:________□■□□□□□□■□□□■□□■□□ プロセス7:__________□■□□□□□□■□□□■□□■ プロセス8:_____________□■□□□□□□■□□□■ (以下略) 「DCの確保しっ放し」が「問題あり過ぎ」なのは、これで理解出来たでしょうか?
その他の回答 (2)
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
追記。 簡単に説明すると「DCを確保したまま開放せずに持ちっ放しする」のは「カラオケに行って自分が歌う順番じゃないのにマイクを手放さないで独占する」のと同じです。 マイクが1本しか無ければ「他の人が歌えなくなってしまう」でしょう。自分が歌い終わったら、マイクをテーブルに置いて次の人が歌えるようにするのがマナーです。 Windowsでは「マイクが256本ある」ので「1本くらい占有しても、問題がないように見える」のです。でも「1本占有する人が256人居れば、他の人が歌えなくなる」のは同じなので、やはり「問題あり」です。
お礼
自分のプログラムでは持ちっぱなしにしたいですけど、確かに他のプログラムにそれをやられたら困りますね。しっかり知れてよかったです。
- gau_puzzler
- ベストアンサー率48% (39/81)
えーと、いろんなものを操作するためのハンドルといえばよいでしょうか? 車を運転するのにはハンドルが必要ですよね? そういう感じです windowsで動くアプリケーションは 必要な時にハンドルを取得して、使用し、使い終わったら解放するのが習わしです 1台の車をみんなでシェアリングしているようなイメージです
お礼
シェアリングですか!ではあまり多くのハンドルを持っておくということはないんですね。 回答ありがとうございました。
お礼
なるほど!デバイスコンテキストには確保の上限があるんですか。だから使い終わったら解放しなければいけないんですね。 回答ありがとうございました!