thread-Funktion / Zugriff auf Members



  • Hi,

    irgendwie komme ich hier nicht weiter. Hab soviel gelesen, dreht sich alles.
    Folgendes: Hab ne statische Thread-Memberfunktion in meiner Viewklasse deklariert und mochte nur in der Definition dieser Funktion auf Membervariablen und auch auf Controls der Klasse zugreifen. Auf CEdits kann ich zugreifen, aber an das CListCtrl komm ich nicht ran. Soweit bin ich gekommen:

    UINT CsqalView::ThreadProc(LPVOID param)
    		{
    		int nItemCount; 
    		CString str = _T(""); 
    		CString find = _T("");
    		CsqalView* pView = (CsqalView*) param; //param = this
    		pView->GetDlgItemText(IDC_EDIT2, find); //funzt
    		//ab hier ist was falsch, denk ich
                      pView->GetDlgItem(IDC_LIST1); 
    		CListCtrl* pListCtrl = (CListCtrl*) pView;	
    		nItemCount = pListCtrl->GetItemCount();
                      //Testausgaben ...
    		CString test;
    		test.Format("%s", nItemCount);
    		pView->SetDlgItemText(IDC_EDIT1, test); //(NULL)
    		pView->SetDlgItemText(IDC_EDIT1, "TEST"); //funzt
    

    Hab auch keine Fehlermeldung nur in IDC_EDIT1 wird kein iItemCount ausgegeben, nur (null)
    Was mach ich falsch? Rückgabe von GetDlgItem ist CWnd. Wie bring ich das ins Spiel. Hab schon soviel ausprobiert. Das Aufrufen des Threads und seine Beendigung klappt auch super - nur der Zugriff auf nicht statische Klassenelemente will nicht richtig, besonders die komplexeren Controlls wie CListCtrl.

    Hoffentlich kann mir jemand weiterhelfen

    Danke

    Gruss
    koreson



  • koreson schrieb:

    pView->GetDlgItem(IDC_LIST1);

    Du lässt dir einen Zeiger auf dein List Control (Rückgabewert von GetDlgItem) geben, machst aber nichts damit.

    CListCtrl* pListCtrl = (CListCtrl*) pView;

    Und dann castest du deinen View-Zeiger auf einen CListCtrl-Zeiger. Deine View ist aber kein List Control.

    Überdenk das nochmal.



  • 'nabend,

    danke für den pädagogischen Ansatz.
    Jetzt bin ich hier angekommen:

    UINT CsqalView::ThreadProc(LPVOID param)
    		{
    		int nItemCount; 
    		CString str = _T(""); 
    		CString find = _T("");
    		CsqalView* pView = (CsqalView*) param; 
    		pView->GetDlgItemText(IDC_EDIT2, find);
    		CListCtrl* pListCtrl;
    		pListCtrl = (CListCtrl*) pView->GetDlgItem(IDC_LIST1);
    		nItemCount = pListCtrl->GetItemCount();
    		CString test;
    		test.Format("%s", nItemCount);
    		pView->SetDlgItemText(IDC_EDIT1, test);
    

    Lässt sich auch kompilieren. Stürzt aber mit Assertions fail wincore line 1000
    ab.

    ????????????????????????? 😕 😕 😕 ??????????????

    Bitte noch einen Tipp

    gruss
    koreson



  • Alles klar, funzt jetzt.
    Der letze Fehler, war in

    test.Format("%s", nItemCount);

    zu finden. Natürlich %d - hat man ja auch schon oft gemacht.
    Danke und Gute Nacht

    koreson



  • Und jetzt kommt ein Thread und möchte die gleichen Steuerelemente benutzen. Was machst du dann?

    Weiters hast du eine Workerthread. Für sowas gibt es Benutzeroberflächenthread. Sidn Klassen welche von CWinThread abgeleitet sind.


Anmelden zum Antworten