Trying to disable Processor idle states (C states) on Windows PC
You can use SetThreadExecutionState function which enables the application to inform the system that it is in use.
EDIT: After a little research and testing I came to a solution or I think I did. You're on the right track for Windows XP. If you read the documentation for the PROCESSOR_POWER_POLICY structure , you'll notice you can disable each C-states that offends you:
Policy[0].AllowPromotion = 0; // Disable's C1 (usually C1 won't cause problems, so you should leave it alone.)Policy[1].AllowPromotion = 0; // Disable's C2Policy[2].AllowPromotion = 0; // Disable's C3
In Vista and Windows7 you can't use this interface instead you have to do this:
GUID *scheme;PowerGetActiveScheme(NULL, &scheme); PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, 1); PowerSetActiveScheme(NULL, scheme);
I haven't found a way to disable individual C states on Vista and Windows 7. If you need some sample codes please email me I can help you out.
This seems to be working for me:
void PowerState(bool bEnable){ // CPU idle state unsigned int ActPwrSch; MACHINE_PROCESSOR_POWER_POLICY Policy; if (GetActivePwrScheme(&ActPwrSch)) { if (ReadProcessorPwrScheme(ActPwrSch, &Policy)) { Policy.ProcessorPolicyAc.Policy[0].AllowPromotion = bEnable ? 1: 0; // C1 Policy.ProcessorPolicyAc.Policy[1].AllowPromotion = bEnable ? 1: 0; // C2 Policy.ProcessorPolicyAc.Policy[2].AllowPromotion = bEnable ? 1: 0; // C3 if (WriteProcessorPwrScheme(ActPwrSch, &Policy)) SetActivePwrScheme(ActPwrSch, 0, 0); } } OSVERSIONINFO osvi; memset(&osvi, 0, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); // For Vista and above if (osvi.dwMajorVersion >= 6) { static const GUID processor_idle_disable_guid = {0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad}; GUID *scheme; PowerGetActiveScheme(NULL, &scheme); PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &processor_idle_disable_guid, bEnable ? 0 : 1); PowerSetActiveScheme(NULL, scheme); }}