LVN_ITEMCHANGED temp. abschalten?
-
Moinsn,
kann man die LVN_ITEMCHANGED von CListCtrl irgendwie vorübergehend 'abschalten'?
Folgendes Problem: Ich lese eine 105 MB grosse Textdatei ein. Zeilenweise einlesen, Einträge prüfen, tlw. formatieren und davon werden dann ca 60% ( = 101021 ) der Zeilen in einem ListCtrl angezeigt. Läuft auch.
Nur jetzt kommts: Laden und ListCtrl füllen OHNE LVN_ITEMCHANGED => ca. 1:40 Min. OK, grosse datei, passt scho.
Aber jetzt das ganze MIT LVN_ITEMCHANGED => ca 18 Min!!!
Wäre also gut, wenn die LVN_ITEMCHANGED erst dann 'reagieren' würde, nachdem die Daten im ListCtrl stehen.
grüssle

-
Wie lange dauerts, wenn du im LVN_ITEMCHANGED-Handler eine if machst die einen bool prüft und den bool setzt du nach Bedarf?

-
estartu schrieb:
Wie lange dauerts, wenn du im LVN_ITEMCHANGED-Handler eine if machst die einen bool prüft und den bool setzt du nach Bedarf?

jep, damit gehts. Wollte es wohl zu schön machen.
Vorher:void CFileReaderView::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView->iItem == -1) return; POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); int itm = m_listCtrl.GetNextSelectedItem(pos); if( itm > -1 ) SetLineNmbrSBText( itm ); *pResult = 0; }Nachher:
void CFileReaderView::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { if( load ) return; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); int itm = m_listCtrl.GetNextSelectedItem(pos); if( itm > -1 ) SetLineNmbrSBText( itm ); *pResult = 0; }Aber einfach ist oft doch die bessere Lösung.
grüssle

-
Falscher Ansatz. LVN_ITEMCHANGED wird immer versendet.
Besser: Prüfe doch einfach nach ob sich ein Status ändert, der für Dich relevant ist: LVIS_SELECTED!
Solange sich hier nichts tut, brauchst Du auch nichts zu machen.
void CMyDialog::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // Check if any changes in the selection state if ((pNMLV->uChanged & LVIF_STATE)==0 || ((pNMLV->uOldState & LVIS_SELECTED)==(pNMLV->uNewState & LVIS_SELECTED))) // Nothing changed return; ...
-
Thx Martin,
mit nem bool gehts zwar auch, aber nicht so elegant. Zeitunterschied sehe ich auch keinen.
Und man muss nicht so aufpassen, dass der bool auch immer richtig gesetzt ist.

grüssle

-
Der Performance Unterschied wird dann relevant, wenn Du z.B. aktiv auch viele Daten in dem Liest View änderst. Dann wird es nämlich teuer.
Jede Änderung löst bei Dir ein Suchen nach einem selektierten Item aus, was gar nicht notwendig wäre...