关于VC6中引入Microsoft Office Chart11后,EXE运行时CPU100%的解决

      有些用VC6引入Microsoft Office Chart 11.0开发程序时可能会发现,如果把控件加到对话框资源上,只要一运行程序,电脑CPU马上就到100%了,中断以后可以发现,程序在COccManager和BindControls函数中CDataBoundProperty* pBinding = pSite->m_pBindings;
   if(pBinding)
   {
    while(pBinding)
    {

这附近停住了,在这个地方仔细跟踪的时候可以发现,这个while已经陷入了死循环,正因为这里的死循环才导致了CPU的100%,如果修改这里,需要重新编译VC库,但经过分析,发现,可以通过以下的方法将此改写。

 

我们自己写一个类,继承自COccManager,重写它的CreateDlgControls(CWnd* pWndParent, void* lpResource,
 _AFX_OCC_DIALOG_INFO* pOccDlgInfo)函数,在最后面的

if (bSuccess)
 {
  // unfreeze events now that all controls are loaded
  if (m_mapCustomCtrlContMap.count(pWndParent) > 0 && m_mapCustomCtrlContMap[pWndParent] != NULL)
   m_mapCustomCtrlContMap[pWndParent]->FreezeAllEvents(FALSE);

  BindControls(pWndParent);
 }

这里,将BindControls改成自己的函数,改写就是把它的BindControls函数拷贝一下,修改一个地方,即可,修改的地方,就是将上面的while那一段改成以下的:

while(pBinding)
    {
     pBinding->SetClientSite(pSite);
     if (pBinding->m_ctlid != 0)
     {
      CWnd* pWnd = pWndParent->GetDlgItem(pBinding->m_ctlid);
      
      pBinding->SetDSCSite(m_mapCustomCtrlContMap[pWndParent]->m_mapCustomSiteMap[pWnd]);
     }
     pBinding = pBinding->GetNext();
    }

 

然后在我们的工程app类的InitInstance类里,一般系统自己生成的都是


 AfxEnableControlContainer();

 

现在改成: 

manager = new CCustomOccManager();
 AfxEnableControlContainer(manager);

 

就把系统本身用的COccManager替成了我们自己写的CCustomOccManager,程序就可以了,试试,就不会100%了。

 

下面是我做的分析图:

分析图

 

可加QQ:254963715或发邮件至glass_heart_1979@163.com进行交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值