Newbie: in Mfc Methoden ohne Objekt aufrufen??
-
Hi,
ich bin was MFC und C++ angeht ein blutiger Anfänger und das ist mein erster post hier, also haut mich bitte nicht direkt in die Pfanne!
Also folgendes Problem:
Ich hab hier ein Dialogfeld, dass, wenn man auf 'ok' clickt. von 30 auf 0 runterzählt (mit ProgressBar). Wollte Multithreading mit einbringen, aber damit hatte ich nur probs: wußte nicht wie ich eine Methode von CcountdownDlg als die Funktion festsetzen kann, die mit dem Thread gestartet wird, also hab ich sie global gemacht (counting). Da aber viele Befehle darin net global funzen hab ich einfach aus 'counting' ne andere Funktion 'fcounting' gemacht. -Wie ich die aufrufen kann weiß ich allerdings auch net

Das prob is ja das ich um ne Methode aufzurufen eigentlich immer nen Objekt brauche (ODER??)
sorry, hab wieder viel zu viel geschrieben, also:1)kann man, wenn ja wie, methoden aufrufen ohne ein Objekt?
2)wie kriegt man bei den mfc eigentlich nen guten Stil hin? alles in die
ProgrammDlg.cpp unter die Methode von einem Button, oder wie??void CcountdownDlg::fcounting(void) { SetDlgItemText(IDOK, "Abbrechen"); int sekunden; int limit = 0; for (sekunden=limit;sekunden>=0;sekunden--) { Sleep(1000); m_sek.Format("noch %i Sekunde(n) bis zu..",sekunden); m_Progress.SetPos(100*sekunden/limit); UpdateData(FALSE); } } UINT counting(LPVOID param) { fcounting(); // wie kann ich hier die Funktion aufrufen??? return 0; } void CcountdownDlg::OnBnClickedOk() { HWND hWnd = GetSafeHwnd(); AfxBeginThread(counting, hWnd, THREAD_PRIORITY_NORMAL); }
-
Hi
Meto schrieb:
1)kann man, wenn ja wie, methoden aufrufen ohne ein Objekt?
Ja klar, du musst die Methode mit static deklarieren also z.B.
class cat { cat() {} ~cat() {} static void miao(){ AfxMessageBox("Miao"); } } // So wird die Methode miao() irgendwoanders aufgerufen: cat::miao();Meto schrieb:
2)wie kriegt man bei den mfc eigentlich nen guten Stil hin? alles in die
ProgrammDlg.cpp unter die Methode von einem Button, oder wie??Wenn du mit MFC programmierst (und auch sonst) würde ich viel Wert auf objektorientiertes Programmieren legen.
Übrigends: von der Sleep Methode ohne Threading würde ich die Finger lassen, da dein Programm, in der Zeit, wo das Programm sleep ausführt, auf keine Benutzereingaben reagieren kann (benutz z.B einen Timer).
Grüße Raphael
-
Ach, hab übersehen, dass du ja nen eigenen Thread benutzt.
Trotzdem gibts noch das Problem, dass dein Thread nicht frühzeitig beendet werden kann (etwa wenn das Programm vorzeitig beendert werden soll: deinen Thread kümmerts nen dreck und er rechnet einfach weiter :D).
Grüße Rapha
-
vielen vielen Dank

-
sorry, hab da aber noch ein Problem:
wenn ich die Thread-Funktion static mache, dann streikt mein compiler, weil ich da drinne lauter non-static Sachen aufrufe
"Unzulässiger Aufruf einer nicht statischen Memberfunktion"was kann man da machen?
-
Jep, das ist natürlich klar. Du darfst in einer statischen Funktion keine nicht-statischen Sachen machen (hast du ja bereits erkannt).
Eine mögliche Lösung wäre deiner Thread Funktion einen Pointer auf deine Dialogklasse (besser gesagt auf deine Dialoginstanz) zu übergeben:
UINT counting(LPVOID param) { CcountdownDlg* pDlg = (CcountdownDlg*) param; pDlg->SetDlgItemText(IDOK, "Abbrechen"); int sekunden; int limit = 0; // hier bitte was > 0 eingeben :-) for (sekunden=limit;sekunden>=0;sekunden--) { Sleep(1000); pDlg->m_sek.Format("noch %i Sekunde(n) bis zu..",sekunden); pDlg->m_Progress.SetPos(100*sekunden/limit); pDlg->UpdateData(FALSE); } return 0; } void CcountdownDlg::OnBnClickedOk() { AfxBeginThread(counting, this, THREAD_PRIORITY_NORMAL); }Eine einfachere Lösung wäre, wie schon gesagt die Timer-Variante:
Stichwörter:
SetTimer
KillTimer
WM_TIMERGrüße Rapha
-
hi
hab mit dem code aber noch ein prob: pDlg->updateData(FALSE) will da net funzen und verursacht im prog Fehler (nicht beim compilieren sondern beim ausführen) Nehm ich nur pDlg->UpdateData(FALSE) raus, dann läuft alles tip top. Was läuft da wieder schief???
-
UpdateData() darfst du eben nur in dem Thread benutzen, in dem das zugehörige Dialogfeld läuft, in allen anderen ist es illegal und führt zum Absturz.
-
aha!
habsch net gewusst!wie krieg ich das denn jetzt hin? hab schon einiges versucht aber nix klappt.
PS: könnt ihr mir nicht mal nen wirklich gutes Buch über MFC empfehlen oder sonst ne Möglichkeit das zu lernen, kann ja nich bei jedem kleinen Problem hier im Forum fragen!
Meto