Dialogfeld, wärend Schleife keine Rückmeldung
-
UINT CMeineKlasse::Funktion() { // eigentliche Threadfunktion } CMeineKlasse::Aufruf() { AfxBeginThread(ThreadFunktion,this); } UINT ThreadFunktion(LPVOID pParam) { CMeineKlasse *pMeineKlasse = (CMeineKlasse *)pParam; return pMeineKlasse->Funktion(); }
-
PeekMessage mag zwar auch gehen aber man trennt ausgabe und Oberfläche immer von der Arbeit.
Also verwendet Threads auch wenn es jetzt mal schwieriger wird. Irgendwann wirst du mit PeekMessage nicht mehr auskommen (und das sehr schnell) und brauchst dann erst Threads.
-
Besten Dank für Eure Antworten. Windalf: Genau so ein Codebeispiel
habe ich gesuchtDann nehme ich das PeekMessage wieder raus.
Unix-Tom: Falls es sich kurz erklären lässt, was kann ich im großen
und ganzen mit PeekMessage nicht machen oder wo ist der Unterschied?
Denn meine PeekMessage Funktion rufe ich doch auch nur dort auf wo
ich Sie brauche, genau wie AfxBeginThread;BOOL PeekAndPump() { static MSG msg; while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if (!AfxGetApp()->PumpMessage()) { ::PostQuitMessage(0); return FALSE; } } return TRUE; }
Muss ich die Thread Funktion eigentlich Global anlegen oder kann ich
sie auch in die Klasse einbauen?Steige grad auf c++ um, daher sind Threads ziemliches Neuland für mich.
-
Hallo, ich habe eben Windalfs code mal ausprobieren wollen, da ich das gleich problem wie 2oopuls habe, aber bei mir meckert der compiler
C2665: 'AfxBeginThread' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (void *)' konvertiert werden
die Hilfe hilft mir auch nicht wirklich weiter - hat jemand eine Idee, muss man da noch auf etwas achten???
-
Muss ich die Thread Funktion eigentlich Global anlegen oder kann ich
sie auch in die Klasse einbauen?einfach als static member anlegen dann funzt das auch so...
@pinorrix
probier mal so
erstell dir einen neuen dialog... da packst du zwei buttons rauf "start" und "stop" und ein editfeld...header von dem dialog so
class CThreadexampleDlg : public CDialog { // Construction public: CThreadexampleDlg(CWnd* pParent = NULL); // standard constructor void Funktion(); int cancelflag; static UINT ThreadFunktion(LPVOID pParam); . . .
und das dazugehörige cpp-file
. . . void CThreadexampleDlg::OnButtonStart(){ cancelflag=0; GetDlgItem(IDC_BUTTON_START)->EnableWindow(false); AfxBeginThread(ThreadFunktion,this); } void CThreadexampleDlg::OnButtonStop(){cancelflag=1;} void CThreadexampleDlg::Funktion(){ CString str; while(!cancelflag){ str+="LINUX SUCKS "; GetDlgItem(IDC_EDIT1)->SetWindowText(str); Sleep(500); } } UINT CThreadexampleDlg::ThreadFunktion(LPVOID pParam){ CThreadexampleDlg* pMeineKlasse = (CThreadexampleDlg*)pParam; pMeineKlasse->Funktion(); pMeineKlasse->GetDlgItem(IDC_BUTTON_START)->EnableWindow(true); return 0; }
-
Wau, das nenn ich ne spitzen Hilfe. Aller besten Dank Windalf.
-
@2oopuls
Bei deinem Nick fällt mir dazu nur ein:
"Ja, ich werd noch mal blöde mit dem Scheiss Ding. Ich hab mir ja vorigen Donnerstag und das geht nicht. Wie funktioniert das?"
"Was haben sie denn gekauft?"
"Na da wo man hier mit die Kassetten, ich seh aber nix"
.
.
.
"Der geht, so ne Scheisse ich rege mich auf am Wochenende und der geht...."
-
danke Windalf - es hat am static gelegen...
...DDX_Text(pDX, IDC_EDIT1, str);... while(!cancelflag) { str+="LINUX SUCKS "; UpdateData(FALSE); //crash?? //GetDlgItem(IDC_EDIT1)->SetWindowText(str); }
kann es sein, dass UpdateData wie oben immer nen crash erzeugt, wiso?
was mir noch aufgefallen ist, dass wenn ich in der Funktion() nen neues Dialogfenster per DoModal() aufrufe, dass ich dann nicht mehr auf die daten per ((CThreadexampleDlg*)GetParent())->....; zugreifen kann. die werte sind null... ist dieser Austausch überhaupt noch in der weise möglich?
-
Das kommt davon wenn man nicht hören will.
Es gibt 2 Arten von Threads. Die Workerthreads und die Benutzeroberflächenthreads.
In einem Thread kann man UpdateData nicht aufrufen.Ein Workerthread ist lediglich dazu gedacht arbeiten zu erledigen während man mit der Eingabe weitermachen kann.
Das ist ein Workerthread: UINT ThreadFunktion(LPVOID pParam)Der andere leitet sich von der Klasse CWinthread ab.
Diesem kann man den this-Zeiger des Dialogs übergeben und dann gegebenefalls Steuerelemente updaten. Manchmal muss man zwar Sync aber dies ist ein generelles Threadproblem.
-
@2oopuls
Bei deinem Nick fällt mir dazu nur ein:
"Ja, ich werd noch mal blöde mit dem Scheiss Ding. Ich hab mir ja vorigen Donnerstag und das geht nicht. Wie funktioniert das?"
"Was haben sie denn gekauft?"
"Na da wo man hier mit die Kassetten, ich seh aber nix"
.
.
.
"Der geht, so ne Scheisse ich rege mich auf am Wochenende und der geht...."@Windalf, ich seh scho du bist ein echter Kenner
Gibt nicht viele die wissen was der Nick zu sagen hat.zwehunnerd puls hab isch. bald
-
klar ist das geilste internetfile wo gibt und dein nick hat mich dazu gebracht es mal wieder hervorzuholen und es mir heute mindestens 30 mal anzuhören. Wird irgendwie bei jedem mal lustiger