G
Guest
Написал много CListCtrl в своей практике. Никогда не было проблем.
Но сейчас в новом (большем) проекте, "наступил" на такой баг:
В одном из многих больших диалогов создается маленький (2 x 9) CListCtrl:
В нем кроме других "вещей" в Реал-time работает постоянно (часто) функция, которая меняет значения в 1 столбце.
При чем, вызывается она с разных мест:
Так вот, если открыть другой диалог в это время... - вся аппликация при этом подвисает "мертво"... :sad: CPU, при этом, не используется...
Функция обновления вызывается в 2 местах, из диалогa... Pаботает постоянно, но "отцовство" запутанное...
Код писался годами. Проэкт большой. Наследование запутанное. Очень много
threads. Дебагировать сложно... :shuffle:
Код не мой, но баг не могу найти. У кого какие идеи?
Но сейчас в новом (большем) проекте, "наступил" на такой баг:
В одном из многих больших диалогов создается маленький (2 x 9) CListCtrl:
Код:
#define NUM_COLUMNS 2
#define NUM_ITEMS 9
...Dlg::OnInitDialog():
{................................
int i;
LV_COLUMN lvc;
CRect rect;
m_LargeImageList.Create(1, 18, ILC_COLOR, 1, 1);
m_LSStatusListCtrl.SetImageList(&m_LargeImageList, LVSIL_NORMAL);
m_LSStatusListCtrl.SetImageList(&m_LargeImageList, LVSIL_SMALL);
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
m_LSStatusListCtrl.GetWindowRect(&rect);
for(i = 0; i < NUM_COLUMNS; i++)
{
lvc.iSubItem = i;
lvc.pszText = m_strColumnLabel[i];
lvc.fmt = n_ColumnFmt[i];
lvc.cx = rect.Width() * n_ColumnWidth[i];
m_LSStatusListCtrl.InsertColumn(i,&lvc);
}
// insert items
LV_ITEM lvi;
CString desc_str;
for(i = 0; i < NUM_ITEMS; i++)
{
lvi.mask = LVIF_TEXT | LVIF_STATE;
lvi.iItem = i;
lvi.iSubItem = 0;
desc_str.LoadString(n_ItemNames[i]);
lvi.pszText = desc_str.GetBuffer(1);
lvi.stateMask = LVIS_STATEIMAGEMASK;
lvi.state = INDEXTOSTATEIMAGEMASK(1);
m_LSStatusListCtrl.InsertItem(&lvi);
}
...................
}
В нем кроме других "вещей" в Реал-time работает постоянно (часто) функция, которая меняет значения в 1 столбце.
При чем, вызывается она с разных мест:
Код:
...Dlg::SetStatus()
{
CString sTmp1;
// получаем значение sTmp1
m_LSStatusListCtrl.SetItemText(0, 1, sTmp1):
// получаем значение sTmp1
m_LSStatusListCtrl.SetItemText(1, 1, sTmp1);
// получаем значение sTmp1
m_LSStatusListCtrl.SetItemText(2, 1, sTmp1);
// получаем значение sTmp1
....................................
m_LSStatusListCtrl.SetItemText(8, 1, sTmp1);
}
Так вот, если открыть другой диалог в это время... - вся аппликация при этом подвисает "мертво"... :sad: CPU, при этом, не используется...
Функция обновления вызывается в 2 местах, из диалогa... Pаботает постоянно, но "отцовство" запутанное...
Код писался годами. Проэкт большой. Наследование запутанное. Очень много
threads. Дебагировать сложно... :shuffle:
Код не мой, но баг не могу найти. У кого какие идеи?