VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 751|回复: 5

[求助] 线程导致cpu使用率过高的问题

[复制链接]
16_avatar_middle
在线会员 突突突突 发表于 2018-3-16 14:30:47 | 显示全部楼层 |阅读模式
3驿站币
这段代码是截取屏幕然后不断在窗口中显示出来。但是每次执行到这里cpu就暴涨。本人才疏学浅找不到问题,帮忙看下
CVCamSDKImpl* pVCam = (CVCamSDKImpl*)lpParam;
        if (pVCam)
        {
                //int n = 0;
                while (!pVCam->m_bStopCapture)
                {
                        int x = pVCam->m_rcCaptureZone.left;
                        int y = pVCam->m_rcCaptureZone.top;
                        int cx = pVCam->m_rcCaptureZone.right - pVCam->m_rcCaptureZone.left;
                        int cy = pVCam->m_rcCaptureZone.bottom - pVCam->m_rcCaptureZone.top;
                        // Initialize BITMAPINFOHEADER
                        BITMAPINFOHEADER bi;
                        bi.biSize = sizeof(BITMAPINFOHEADER);
                        bi.biWidth = cx;
                        bi.biHeight = cy;
                        bi.biPlanes = 1;
                        bi.biBitCount = 24;
                        bi.biCompression = BI_RGB;   
                        bi.biSizeImage = ((cx*24+31)/32*4)*cy;
                        bi.biXPelsPerMeter = 0;
                        bi.biYPelsPerMeter = 0;
                        bi.biClrUsed = 0;
                        bi.biClrImportant = 0;
                        // 获取鼠标信息
                        CURSORINFO pci;
                        pci.cbSize = sizeof(CURSORINFO);
                        GetCursorInfo(&pci);
                        POINT ptCursor;
                        GetCursorPos(&ptCursor);
                        ICONINFO IconInfo = { 0 };
                        if (GetIconInfo(pci.hCursor, &IconInfo))
                        {
                                ptCursor.x -= IconInfo.xHotspot;
                                ptCursor.y -= IconInfo.yHotspot;
                                if (NULL != IconInfo.hbmMask)
                                        DeleteObject(IconInfo.hbmMask);
                                if (NULL != IconInfo.hbmColor)
                                        DeleteObject(IconInfo.hbmColor);
                        }
                        // init GDI objects
                        HDC                hdcDesktop = ::GetDC(HWND_DESKTOP);
                        HDC                hdcTemp                = ::CreateCompatibleDC(hdcDesktop);
                        LPBYTE        rgb24Buffer        = NULL;
                        HBITMAP hbmpTemp= ::CreateDIBSection(hdcDesktop, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&rgb24Buffer, 0, 0);
                        ATLASSERT(rgb24Buffer);
                        HGDIOBJ hgoTemp        = ::SelectObject(hdcTemp, hbmpTemp);
                        if (!pVCam->m_bStopCapture)
                        {
                                ::BitBlt(hdcTemp, 0, 0, cx, cy, hdcDesktop, x, y, SRCCOPY);
                                DrawIconEx(hdcTemp, ptCursor.x - x, ptCursor.y - y, pci.hCursor, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT);
                                if (pVCam->m_pConfig)
                                        pVCam->m_pConfig->SendFrameToDriverEx(rgb24Buffer, cx, cy);
                        }
                        ::DeleteObject(::SelectObject(hdcTemp, hgoTemp));
                        ::DeleteDC(hdcTemp);
                        ::ReleaseDC(HWND_DESKTOP, hdcDesktop);
                }
        }

最佳答案

查看完整内容

while 中加个 Sleep(10); 让CPU休息一下试试




上一篇:求解惑 c++小程序
下一篇:易语言中网截功能是如何实现的?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2018-3-16 14:30:48 | 显示全部楼层
while 中加个 Sleep(10); 让CPU休息一下试试

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

16_avatar_middle
ico_lz  楼主| 突突突突 发表于 2018-3-16 14:50:51 | 显示全部楼层
不行。还是一样的。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-3-16 14:55:55 | 显示全部楼层
突突突突 发表于 2018-3-16 14:50
不行。还是一样的。

把这句:
::BitBlt(hdcTemp, 0, 0, cx, cy, hdcDesktop, x, y, SRCCOPY);
或者:
DrawIconEx(hdcTemp, ptCursor.x - x, ptCursor.y - y, pci.hCursor, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT);
或者:
pVCam->m_pConfig->SendFrameToDriverEx(rgb24Buffer, cx, cy);

分别注释掉之后试试,看看到底是哪句话引起的CPU暴涨?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

16_avatar_middle
ico_lz  楼主| 突突突突 发表于 2018-3-16 15:09:29 | 显示全部楼层
忘记说了这是一个线程函数。不知道跟这个有没有关系 。刚才都是了一下。基本没有太大的变化。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

11_avatar_middle
在线会员 LT450196683 发表于 2018-3-22 20:02:55 | 显示全部楼层
SYC所说的两种可能一起实施一下?画图很耗资源,单纯只sleep效果不大吧

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 22:47

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表