Aufruf einer nicht statischen Member-Funktion



  • Hallo,

    versuche innerhalb eines Threads eine Textbox wie folgt zu eitieren:

    UINT CEisenbahnDlg::thrFunction(LPVOID pParam)
    {
       int* pFlag = (int*) pParam;
       while (*pFlag) 
       {
    
    	UpdateData(TRUE);
    	m_Empfang=InString[1];
    	UpdateData(FALSE);
    
       }
       return 0; 
    }
    

    Leider gibt er beim Erstellen mehrfach folgende Fehlermeldung aus:

    Unzulässiger Aufruf einer nichtstatischen Memberfunktion.

    Was ist denn die Ursache dafür und was kann ich dagegen tun??

    Vielen Dank
    Grüße



  • Du musst Deinem Thread eine Instanz der Klasse mitgeben.
    PS: Man greift von einem anderen Thread *nicht* auf Fenster zu, welche nicht von diesem Thread erzeugt wurden!!! Sende bitte eine WM_APP+x Message an den Hauptthread, damit er die Fenster-Operationen (UpdateData) durchführt!



  • Jochen Kalmbach schrieb:

    PS: Man greift von einem anderen Thread *nicht* auf Fenster zu, welche nicht von diesem Thread erzeugt wurden!!! Sende bitte eine WM_APP+x Message an den Hauptthread, damit er die Fenster-Operationen (UpdateData) durchführt!

    Hallo Jochen, dazu hätte ich mal eine Frage:

    Ist es richtig, wenn ich dem Thread einen Zeiger auf das Document mitgebe, dann im Thread auf das Document zugreife und Daten hineinschreibe und dann eine Nachricht an meinen Hauptthread zum Updaten schicke? Und ist es richtig, wenn ich meinen Hauptthread per AfxGetApp() bekomme? Und wird die Nachricht automatisch an meinen View weitergeleitet, wenn ich nur dort einen Messagehandler für die Nachricht habe?

    Wäre nett, wenn du mir das kurz beantworten könntest, ich arbeite das erste mal mit Threads und will es gleich richtig machen! 🙂

    Gruß Brainiac



  • http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel17.htm

    Auf UpdateData(...) sollte man besser verzichten, ist - soweit ich weiß - nicht perfekt threadsicher, also besser alte Methoden anwenden.



  • Brainiac schrieb:

    Ist es richtig, wenn ich dem Thread einen Zeiger auf das Document mitgebe, dann im Thread auf das Document zugreife und Daten hineinschreibe und dann eine Nachricht an meinen Hauptthread zum Updaten schicke?

    Daten solltest Du auf keinen Fall von einem anderen Thread aus verändern! Schicke eine Nachricht an Dein Hauptthread, der dann die veränderung vornimt!



  • Und wenn ich nun große Datenmengen habe? 😕

    In meinem Beispiel soll der Thread ein Array aus Structs zurückliefern, welches mehrere 100-1000 Elemente enthalten kann. Wie kann ich dieses Array nun per Nachricht an meinen Hauptthread schicken? Geht das komplett per WM_COPYDATA? Oder muss ich für jedes einzelne Element eine Nachricht schicken? Ich kann doch in einer Nachricht nur sehr begrenzt Informationen senden (wParam und lParam), wie macht man so etwas in der Praxis?

    Bis jetzt habe ich dem Thread einfach einen Zeiger auf das Document mitgegeben, und dort die Daten direkt hineingeschrieben... 🙄

    Gruß Brainiac


  • Mod

    Wenn große Datenmengen ausgetauscht werden sollen, dann Stele doch dafür eine eigene Struktur zur Verfügung undnimm nicht WM_COPYDATA! Das ist doch unnötig!

    Wenn Dein Thread startet bekommt er doch einen Zeiger auf einen void*. In diesem Zeiger verstaust Du eine Struktur, die alles hat was der Thread braucht inkl. Ergebnis Bereich.

    Theoretisch kannst Du hier eine std::queue nehmen und diese auch durch eine critical section absichern. Dann könnte Dein Thread schreiben und der Thread der die Antowrt will gleichzeitig lesen.



  • Ich habe gerade ein ähnliches Problem und dazu eine sehr diletantische Frage:

    Jochen Kalmbach schrieb:

    Schicke eine Nachricht an Dein Hauptthread, der dann die veränderung vornimt!

    Was ist denn der Hauptthread in einer Standard MFC (Dialog) Anwendung, wo finde ich den?
    Ich habe jedenfalls nur einen zusätzlichen Thread erstellt, der ist klar erkennbar, aber einen Hauptthread kann ich leider nicht finden... :oops:

    Danke und Gruß!



  • ASSERT(AfxGetMainWnd() != NULL);
    AfxGetMainWnd()->PostMessage(WM_APP+x);
    

    Siehe auch:
    http://www.codeproject.com/threads/usingworkerthreads.asp



  • Martin Richter schrieb:

    Wenn große Datenmengen ausgetauscht werden sollen, dann Stele doch dafür eine eigene Struktur zur Verfügung undnimm nicht WM_COPYDATA! Das ist doch unnötig!

    Wenn Dein Thread startet bekommt er doch einen Zeiger auf einen void*. In diesem Zeiger verstaust Du eine Struktur, die alles hat was der Thread braucht inkl. Ergebnis Bereich.

    Theoretisch kannst Du hier eine std::queue nehmen und diese auch durch eine critical section absichern. Dann könnte Dein Thread schreiben und der Thread der die Antowrt will gleichzeitig lesen.

    Hmmm, erst mal danke für die Antwort, aber wo ist damit nun der Unterschied zu der Übergabe eines Zeigers auf das Doc? Das Document ist doch auch nur eine Klasse und den Zugriff darauf kann ich ja auch in einer Critical Section machen? 😕



  • *push*

    Kann mir das jemand beantworten? 😕



  • Der Pointer ist laut microsoft nicht konsistent (do not store for later use) zumindest nicht auf Dauer.


Anmelden zum Antworten