Возможная проблема с памятью в WinAPI ListView - PullRequest
0 голосов
/ 07 февраля 2019

Я создаю клиент SQL с WinAPI .Каждый раз, когда пользователь отправляет запрос, текущие столбцы и элементы моего ListView удаляются, затем создаются новые столбцы и элементы на основе результатов запроса.

Я заметил через Visual StudioПрофилировщик кучи, что каждый раз, когда создаются столбцы и элементы, выделяются 3 объекта и ~ 60 байт , и я не могу понять, почему.Изучение снимка показывает, что это связано с добавлением подэлементов с помощью функции ListView_SetItem (_ListView_OnSetItem - последнее, что я могу определить в представлении стеков).

Результаты, которые я использую для проверкис помощью создания 4 столбцов и 36 элементов / подпунктов.

Насколько я знаю, я правильно реализовал материал ListView.Тем не менее, вот две мои функции, которые сбрасывают и заполняют ListView.Любая помощь приветствуется.

void ResetListView(HWND hWnd) {

    HWND hWndHdr = (HWND)SendMessage(GetDlgItem(hWnd, IDQ_LISTVIEW), LVM_GETHEADER, 0, 0);
    int numColumns = (int)SendMessage(hWndHdr, HDM_GETITEMCOUNT, 0, 0L);

    ListView_DeleteAllItems(GetDlgItem(hWnd, IDQ_LISTVIEW));
    for (int i = 0; i < numColumns; i++)
        ListView_DeleteColumn(GetDlgItem(hWnd, IDQ_LISTVIEW), 0);
}

void CreateListView(HWND hWnd, QueryResults * queryResults) {

    LVCOLUMN lvc;
    ZeroMemory(&lvc, sizeof(LVCOLUMN));
    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    lvc.fmt = LVCFMT_CENTER;

    int numHeaders = queryResults->numHeaders;

    // Add columns
    for (int i = 0; i < numHeaders; i++) {
        lvc.iSubItem = i;
        lvc.pszText = queryResults->headers[i];
        lvc.cx = 100;
        ListView_InsertColumn(GetDlgItem(hWnd, IDQ_LISTVIEW), i, (LPARAM)&lvc);
    }

    LVITEM lvi;
    ZeroMemory(&lvi, sizeof(LVITEM));
    lvi.mask = LVIF_TEXT;

    // Add items and subitems
    for (int i = 0; i < queryResults->rows.size(); i++) {
        lvi.iItem = i;

        lvi.pszText = queryResults->rows[i]->cells[0];
        lvi.iSubItem = 0;
        ListView_InsertItem(GetDlgItem(hWnd, IDQ_LISTVIEW), (LPARAM)&lvi);

        for (int j = 1; j < numHeaders; j++) {
            lvi.pszText = queryResults->rows[i]->cells[j];
            lvi.iSubItem = j;
            ListView_SetItem(GetDlgItem(hWnd, IDQ_LISTVIEW), (LPARAM)&lvi);
        }
    }

    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...