我需要阻止处理器进入空闲状态(非C0 C状态).不可否认,我对处理器C和P状态知之甚少,所以请耐心等待.我们使用来自第三方供应商的相机,偶尔会提供损坏的帧.供应商已确定当CPU进入空闲状态时,它会干扰火线上框架的传输.为了确认这一点,我在Windows 7 PC上使用了以下代码,实际上,禁用空闲状态解决了这个问题.
//WIN7
const DWORD DISABLED = 1;
const DWORD ENABLED = 0;
GUID *scheme;
PowerGetActiveScheme(NULL, &scheme);
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
PowerSetActiveScheme(NULL, scheme);
Run Code Online (Sandbox Code Playgroud)
如果我跑我的应用程序并打开Windows permon并添加%C1时,%C2时间和%C3一次我看到他们都是零,当我禁用这些国家,当我让他们,我看到了相当多的时间中度过C3状态(这是在Dell Precision T3500四核PC上).
我还需要在XP上执行此操作,但这些调用在XP上不可用.所以我尝试执行以下操作来禁用空闲状态
unsigned int ActPwrSch;
DWORD currPolicy,newPolicy, curr1Policy,curr2Policy, new1Policy, new2Policy;
MACHINE_PROCESSOR_POWER_POLICY Policy;
if(GetActivePwrScheme(&ActPwrSch))
{
if(ReadProcessorPwrScheme(ActPwrSch,&Policy))
{
printf("Read Power Scheme:\n");
//if(Policy.ProcessorPolicyAc.DisableCStates!=0)
currPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion;
curr1Policy = Policy.ProcessorPolicyAc.Policy[1].AllowPromotion;
curr2Policy = Policy.ProcessorPolicyAc.Policy[2].AllowPromotion;
Policy.ProcessorPolicyAc.Policy[0].AllowPromotion = 0;
Policy.ProcessorPolicyAc.Policy[1].AllowPromotion = 0;
Policy.ProcessorPolicyAc.Policy[2].AllowPromotion = 0;
newPolicy = Policy.ProcessorPolicyAc.Policy[0].AllowPromotion;
if(WriteProcessorPwrScheme(ActPwrSch,&Policy))
{
printf("WriteProcessorPwrScheme succeed\n");
if(SetActivePwrScheme(ActPwrSch,0,0))
{
printf("SetActivePwrScheme succeed!!\n");
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个MFC控件,我将句柄传递给位图(HBITMAP).在控件OnPaint方法中,我使用BitBlt来渲染位图.但是位图正在颠倒呈现.
作为测试,我从这个句柄创建了一个CBitmap对象并将其写入文件,并创建了一个正面朝上的位图.我对BitBlt的调用是否有问题?
我从下面的OnPaint发布了我的代码.我确实尝试将设备上下文的映射模式更改为MM_LOENGLISH,并且能够使位图正面向上渲染,但它非常粗糙.当我在MM_TEXT离开映射模式时,图像的质量是完美的,但正如我所说它是颠倒的.我没有使用位图,blitting等...因此我可能会遗漏一些简单的东西.任何其他建议将不胜感激.对于某些背景,我从摄像机驱动程序中获取BYTE*并创建HBITMAP来渲染视频.我怎样才能正确渲染?非常感谢
void BitmapControl::OnPaint()
{
EnterCriticalSection (&CriticalSection);
if (_handleBMP)
{
CPaintDC dc(this);
//dc.SetMapMode(MM_LOENGLISH);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CRect rect;
GetClientRect(&rect);
dc.DPtoLP(&rect);
CBitmap* pBmpOld = dcMem.SelectObject(CBitmap::FromHandle(_handleBMP));
BitBlt(dc,rect.left,rect.top,rect.Width(),rect.Height(),dcMem,rect.left,rect.top,SRCCOPY); //works with MM_TEXT but upsidedown
//BitBlt(dc,0,rect.bottom,rect.Width(),-rect.Height(),dcMem,0,0,SRCCOPY); //works with MM_LOENGLISH
dcMem.SelectObject(pBmpOld);
DeleteDC(dc);
DeleteDC(dcMem);
DeleteObject(_handleBMP);
DeleteObject(pBmpOld);
_handleBMP = NULL;
}
LeaveCriticalSection (&CriticalSection);
}
Run Code Online (Sandbox Code Playgroud)
编辑*我假设因为我可以将位图以正确的方向保存到磁盘,问题是bitblt.这是我用来生成HBITMAP的代码.
HBITMAP BitmapWriter::CreateBitmapFromFrame(BYTE* frame)
{
BITMAPFILEHEADER* bmfh;
bmfh = (BITMAPFILEHEADER*)frame;
BITMAPINFOHEADER* bmih = &_bmi;
BITMAPINFO* bmpInfo = (BITMAPINFO*)bmih;
HBITMAP hbmp = CreateDIBSection(_hdc,bmpInfo,DIB_RGB_COLORS,NULL,NULL,0);
SetBitmapBits(hbmp,_bmi.biSizeImage,frame);
return hbmp;
}
Run Code Online (Sandbox Code Playgroud)
哦,我使用了临界区,因为我将hbitmap传递给属性中的控件,然后在OnPaint中访问它.如果这是一个潜在的问题,我将不得不重新考虑.谢谢