Datenupdate in ListCtrl



  • Hallo zusammen

    Ich hoffe mir kann jemand eine Antwort auf meine Frage geben!! Und zwar follgendes!

    Ich bekomme über meine serielle Schnittstelle Daten(18 Bytes alle 5ms)! Diese kann ich mir in einer ListCtrl anzeigen lassen! Nun mein Problem. Ich möchte das so realisieren das die Daten fest in der Tabelle stehen und nur wenn sich der Wert ändert soll er auch in der Liste aktualisiert werden! Bisher lösch ich alle Daten und schreib sie wieder neu in die Tabelle aber das möchte ich eigentlich vermeiden!!!

    Vielleicht wisst ihr mehr wie ich!

    mfg Michael

    P.S. Die Daten schreib ich einem Thread in die Tabelle. Nur als Tip vielleicht bringt es euch was!



  • Geht doch ganz einfach über CListCtrl::SetItemText, oder versteh ich da was falsch 😕



  • Das Problem ist nur bei SetItemText das wenn neue Daten kommen diese an meine bestehenden Daten angehängt werden.

    Ich möchte aber das die 18 Bytes einfach nur bei Wertänderung aktualisiert werden, sprich nicht nach unten verschoben werden.

    MFG Michael



  • Dann wist du das überprüfen müssen. Kann dir aber nicht sagen was schneller ist: Das ListCtrl durchgehen und checken oder das ganze in einer MAP oder ähnliches speicher und diese durchgehen.
    Denke aber das 2tere. 5 ms sind aber heftig für Windows.
    Außerdem frage ich mich welche Daten du im ListCtrl hast die 18 Byte repräsentieren.



  • Bekomme die Daten von einem externen Gerät, welche mir alle 5 ms neue Daten schickt

    Muss nicht alle 5 ms Updaten würden auch alle 30 ms langen. Das Problem ist, das ich einen kleinen Ansatz bräuchte, denn ich hab das ganze Wochenende versucht es hinzubekommen, doch leider ohne Erfolg.

    Oder fällt dir etwas besseres ein wie ListCtrl, um Daten anzeigen zu lassen?

    Mfg Michel



  • Es kommt doch darauf an welche Daten.

    Du kannst ja Updaten Ich denke aber das Windows bei 5 ms zu langsam ist. es muss ja auch noch andere Dinge tun. Das ist aber nicht das Problem. Zuerst solltest du mal sagen wie die Daten aussehen und was im ListCtrl steht.



  • Ich glaub das beste ist mal meinen Code dir zu zeigen. Die Daten sind einfach 18 ´Bytes die ich in Dualzahlen umwandle und anzeige.

    while (WaitForSingleObject(hFinish, 0) != WAIT_OBJECT_0)
    	{
    		WaitForSingleObject(hMutex, INFINITE);
    		BYTE * lpEnd = lpCurrent[uiCurrent];
    		lpCurrent[uiCurrent] = lpCommBuffer[uiCurrent];
    		UINT uiLocalCurrent = uiCurrent;
    		uiCurrent = (uiCurrent == 1) ? 0 : 1;
    		BYTE *p = lpCommBuffer[uiLocalCurrent];
    		ReleaseMutex(hMutex);
    
    		CString cstrCaption = "", cstrTemp;
    
    		((CTestDlg*)lpDlg)->m_Byte.InsertColumn( 1, "18 Byte", LVCFMT_CENTER, 50,18 );
    		const int LVS_EX_LABELTIP = 0x0000001;
    		((CTestDlg*)lpDlg)->m_Byte.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_LABELTIP);
    
    		for (; p < lpEnd; p += 1)
    		{
    			cstrTemp.Format("%.2d", *p);
    			cstrCaption += cstrTemp;
    
    			//((CTestDlg*)lpDlg)->m_Byte.GetItemCount();
    			((CTestDlg*)lpDlg)->m_Byte.InsertItem(uiByte, cstrCaption);
    
    			Sleep(10);
    			cstrCaption = "";
    			++uiByte;
    
    			if (((CTestDlg*)lpDlg)->m_Byte.GetItemCount() >= 18)
    			{
    
    				((CTestDlg*)lpDlg)->m_Byte.SetItemCount(0);
    				((CTestDlg*)lpDlg)->m_Byte.DeleteAllItems();
    				uiByte=0;
    				//((CTestDlg*)lpDlg)->m_Byte.SetItemPosition(uiByte);
    			}
    
    		}
    		ReleaseMutex(hMutex);
    
    	}
    

    Hoffe du kannst mir jetzt ein wenig weiter helfen.

    MFG Michel



  • Du brauchst den Insert nur einmal zu machen. Wenn du nur den Text ändern willst dann ist SetItemText dein Freund.



  • Wenn es dir nur um die Ausgabe geht hätte es eine Listbox auch getan da du sowieso nur eine Spalte brauchst.



  • Entweder bin ich jetzt zu blöd oder ich verstehe es einfach nicht!!

    Ich hab mir das so vorgestellt das ich alle 18 Bytes darstelle in einer Liste, welche ich ständig anzeigen lassen kann und nur bei verändertem Wert update!!

    Das mit Insert Text funktioniert leider nicht. So langsam hab ich keine Nerven mehr dafür!! 😡 Ich komme einfach nicht weiter. Denn so wie im Moment mein Code aussieht hab ich ein flackern auf meiner Anzeige, welche ich aber nicht gebrauchen kann.

    Vielleicht eine andere Frage? Wie kann ich es denn schaffen die Werte fest anzeigen zu lassen. Vielleicht komme ich dann mal zu einem kleinen Erfolg!

    Mfg Michel


Anmelden zum Antworten