MFC und die Callbackfunktion
-
Das wäre natürlich eine gute Idee, leider geht das nicht, nach dem Start des Programmst bekomme ich folgende Fehlermeldung: "Debug Assertion failed".
-
Da wird deine Callback-Funktion offenbar aufgerufen, bevor der Dialog existiert - das mußt du abfangen (am besten, indem du den Callback erst in deiner Init-Methode festlegst, wenn alle CDialog-relevanten Initialisierungen überstanden sind).
@Pellaeon: Dann ist mein Gedächtnis doch besser als erwartet
-
Nein. Man darf UpdateData nicht aus einem anderen Thread heraus aufrufen als aus dem, der den Dialog erzeugt hat. Das ist das Problem, nicht, dass der Dialog noch nciht existiert.
Lösung ist eigentlich einfach: Hol dir einen Pointer auf das Dialog-Element via GetDlgItem und ruf darauf SetWindowText auf.
-
Achtung Neugierde: Was ist eigentlich der Sinn einer Callback-Funktion?
Für mich hört sich das meist nach einem Event an?!
-
Callback reagiert auf irgendwelche Ereignisse. In meinem Fall, muss ich die Daten von nem Kontroller auslesen und darauf reagieren.
Da dachte ich, benutz ich mal Callback, aber nix da
Bin schon am Verzweifeln...
Probiere jetzt mal GetDlgItem aus...
-
sadi schrieb:
Callback reagiert auf irgendwelche Ereignisse. In meinem Fall, muss ich die Daten von nem Kontroller auslesen und darauf reagieren.
...und die quelle des Callback liegt wo?
-
Danke für die Erklärung.
Kannst du nicht CEvents und Threads (WairForSingleObject()/WaitForMultipleObject()) benutzen. So habe ich Daten zwischen einer Anwendung und einem µC synchronisiert.
-
@ junix. Von der Hardwareherstellerfirma wird eine Lib und eine DLL angeboten um auf die Sachen vom Kontroller zugreifen zu können. Da ist diese Callbackmetode definiert. Mit C wäre es für mich kein Problem, auf die Callbackfunktion zuzugreifen, in MFC schon, da ich ein MFC-Anfänger bin und MFC Klassenorientiert ist....
Und mit GetDlgItem bzw SetDlgItem krieg ich das nicht hin.
Kann mir jemand sagen, wie ich von der Callbackfnktion aus, IDC_Textfeld bzw eine Variable der Dialogkrasse setztenkann und das auch so, dass alles aktuallisiert wird?
-
Wo ist das Problem?
m_ptr->GetDlgItem(IDC)->SetWindowText(Text);
-
So, wieder Montag
Habs nun heute ausgetestet, funktioniert aber irgendwie nicht. In dem Moment, wo die Callbackfkt sich meldet, wird mein Programm sau langsam und hängt ca. 5 Sek, bis sich dad Dialogfenster aufgefrischt hat.void Callback(AmsAddr* pAddr, AdsNotificationHeader* pNotification, ULONG hUser) { ... ... ... notf=*(ULONG *)pNotification->data; CEtherCATHMIDlg*m_ptr=(CEtherCATHMIDlg*)hUser; if (notf==1) { m_ptr->m_busy=notf; m_ptr->GetDlgItem(IDC_BUSY_ANZEIGE)->SetWindowText("1"); } }
void CEtherCATHMIDlg::OnEnChangeBusyAnzeige() { UpdateData(TRUE); Beep(1200,60); CListBox * pLB = (CListBox*) GetDlgItem ( IDC_ARR_LIST ); CMenu* pSysMenu = AfxGetMainWnd()->GetSystemMenu(FALSE); pSysMenu->EnableMenuItem(SC_CLOSE, MF_DISABLED); pLB -> ResetContent(); ... ... ... UpdateData(FALSE); }
Den Beepton höre ich auch, aber alles, was danach passieren sollte, wie z.B. Listboxausgabe oder Dateibeschreiben, funktionirt auch nicht, erst wenn ich selbst was in IDC_BUSY_ANZEIGE ändere