none
CallNtPowerInformation()でWindowsのCPUの状態を確認しようとするのですが、状態が取得できません RRS feed

  • 質問

  • マルチメディア系のアプリケーションを開発しているのですが、アプリケーションはCPUパワーが十分でなければスムーズに動作できません。
    ノートPCなどは電源管理機能をそのまま使用されている人も多く、ときどきCPUパワーが省電力モードで動作していることがあります。
    そのようなときに、アプリケーションを起動したときに、省電力モードかどうかを確認し、省電力モードであれば、警告を出したいを考えています。
    CallNtPowerInformation()を使うと、ProcessorInformationや、ProcessorPowerPolicyの情報が取得できるようにドキュメントにありました。
    現在、VistaとXPをアプリケーションの対象に想定していますので、このAPIが使えると考えていますが、関数が失敗します。
    電源管理のこのAPIのサンプルコードなど掲載されている情報をご存じの方は教えていただけないでしょうか。


    Reiji Tanaka
    2009年6月11日 15:54

回答

  • CallNtPowerInformation()の戻り値は何になっていますか?
    正常ならスミマセン。
    • 回答としてマーク Reiji 2009年6月17日 7:50
    2009年6月12日 9:24
  • いつもご助言いただき助かります。
    WindowsXPのPCで動いたのでプログラムを疑っていませんでした。
    ご指摘のとおりReturnコードを確認したところ、STATUS_BUFFER_TOO_SMALLでした。
    ドキュメントをよく読むと、マルチコアの場合は、コアごとにデータが取得されるので、バッファが足りなかっただけでした。
    お恥ずかしいかぎりです。

    WindowsXPでもWindowsVistaでもどちらも期待した値を取得できましたので、問題は解決できます。

    ありがとうございます。
    Reiji Tanaka
    • 回答としてマーク Reiji 2009年6月17日 7:50
    2009年6月17日 7:50

すべての返信

  • アドバイスできるかどうか分かりませんが、どのように使用されているのでしょうか?
    よければ、失敗するコードを提示して頂けませんか?(必要な部分のみ)


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年6月11日 16:12
    モデレータ

  • 参考ですが、GetCurrentPowerPolicies()ではだめでしょうか。
    2009年6月12日 1:06
  • コードも掲載せずに質問してすみません。これじゃあフォローのしようがありませんよね。


    単純に以下のコードで試してみました。

    PROCESSOR_POWER_POLICY m_processor_power_policy={0};

    CallNtPowerInformation(
      ProcessorPowerPolicyCurrent,
      NULL,
      0,
      &m_processor_power_policy,
      sizeof(PROCESSOR_POWER_POLICY));

    とりあえず、VistaでVisualStudio2008で実行して、Debuggerで変数に値が変えるかを見ていますが、なにも情報がえられません。
    今度は、WindowsXPで同じものを試すと、そちらでは成功しました。
    このAPIのドキュメントをもう一度読み返すと、

    This information level is not supported.

    Windows Server 2003 and Windows XP:  The lpInBuffer parameter must be NULL; otherwise, the function returns ERROR_INVALID_PARAMETER.

    The lpOutputBuffer buffer receives a PROCESSOR_POWER_POLICY structure containing the current system processor power policy in use.

    とあり、原則はサポートされていないということが原因かもしれません。
    Windows Vistaで同様のことができる関数が分かれば問題は解決できそうです。

    よろしくお願いします。


    Reiji Tanaka
    2009年6月12日 5:01
  • GetCurrentPowerPolicies()は動作しました。
    Azulenさんの質問の返信にもかきましたように、単にVistaで動いていないだけで、それはAPIの仕様かもしれません。

    VistaでCallNePowerInformation()でProcessorの状態が確認できればよいのですが、ご存じありませんか?
    Reiji Tanaka
    2009年6月12日 5:06
  • CallNtPowerInformation()の戻り値は何になっていますか?
    正常ならスミマセン。
    • 回答としてマーク Reiji 2009年6月17日 7:50
    2009年6月12日 9:24

  • ProcessorInformationはVistaで正しく取得できましたが、ProcessorPowerPolicyでないとだめでしょうか。

    詳しく調べてませんがcpuid()でいろいろな情報が取得できます。

    http://www.intel.com/Assets/PDF/appnote/241618.pdf の 3.1.7 Digital Thermal Sensor and Power Management Parametersあたりはどうでしょう。

    2009年6月16日 4:57
  • いつもご助言いただき助かります。
    WindowsXPのPCで動いたのでプログラムを疑っていませんでした。
    ご指摘のとおりReturnコードを確認したところ、STATUS_BUFFER_TOO_SMALLでした。
    ドキュメントをよく読むと、マルチコアの場合は、コアごとにデータが取得されるので、バッファが足りなかっただけでした。
    お恥ずかしいかぎりです。

    WindowsXPでもWindowsVistaでもどちらも期待した値を取得できましたので、問題は解決できます。

    ありがとうございます。
    Reiji Tanaka
    • 回答としてマーク Reiji 2009年6月17日 7:50
    2009年6月17日 7:50
  • ご助言いただきありがとうございます。

    この情報をもとに確認してみましたが、CPUIDでは現在の動作状態は判定できないように思います。
    英語が得意でないので、ドキュメントを誤解しているかもしれませんが。。。

    とりあえず、問題は解決できました。
    おさわがせしました。
    Reiji Tanaka
    2009年6月17日 7:52