多次调用时,SetWindowTextA更新值冻结

时间:2015-11-11 15:31:59

标签: visual-studio winapi

我有一组标签(63),每100毫秒更改一次。标签值存储在orderedTablePressure数组中。在主循环中,我每100毫秒调用以下函数来更新标签值。但是当我在循环中迭代到63时,标签会在很短的时间内冻结(不会改变值),当我迭代到20时,冻结需要更多时间才能发生,但无论如何,当我迭代到10时,它需要几分钟冻结然后冻结(标签值不再更新)。 可能是什么问题呢?它可能是一个内存问题,我应该调用任何自由对象函数吗?

for (int j = 0; j < 20; j++) {

    sprintf(window_text, "%d", orderedTablePressure[j]);
    GetWindowRect(hWndLabel[j], &rect);
    SetWindowTextA(hWndLabel[j], window_text);
}
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    ........

case WM_CTLCOLORSTATIC: {
        DWORD CtrlID = GetDlgCtrlID((HWND)lParam);
        int green = (255 * orderedTablePressure[CtrlID - 1000] / 4096);
        assert(0 <= green <= 255);
        green = (green - 128) * 2;
        clrLabelBkGnd = RGB(255, green, 0);

        hDC = reinterpret_cast<HDC>(wParam);
        SetBkColor(hDC, clrLabelBkGnd);
        return (INT_PTR)hBrushLabel[green];
    }
    break;

1 个答案:

答案 0 :(得分:2)

如果您的应用程序正在运行,但没有任何内容被重新绘制,则很可能是您有资源泄漏,并且您已经用尽了10,000个句柄“津贴”。简单的检查是查看任务管理器, GDI对象列 - 您的流程10,000的值是多少?如果是 - 在绘画函数中查找已创建但未释放的GDI对象。或者在这里张贴 - 一起看。