Dialogfeld, wärend Schleife keine Rückmeldung



  • Schönes Wochenende erstmal...
    Ich habe da ne Frage zur Aktualisierung von Dialogfeldern. Ich hab mir ein
    kleines Dialogfeld gebastelt, mit dem ich Dateien aus dem Web downloaden
    kann. Nun ist mir aufgefallen, wenn ich eine Datei downloade und wärend
    dessen ein anderes Anwendungsfenster aufmache, sich das Dialogfeld nicht
    wieder aufbaut, bevor der Download beendet ist. Das heist, so lang die
    Downloadschleife läuft, kann ich das Dialogfeld weder verschieben, noch
    minimieren oder maximieren. Wenn überhaupt, dann erhalte ich in der Titelleiste
    nur den Text "Keine Rückmeldung" und das Dialogfeld bleibt weiß.

    Nun würde ich gern wissen, was ich machen kann, das ich das Dialogfeld
    wie bei jedem anderen Programm auch, weiterhin verschieben, minimieren
    und maximieren kann.

    Besten Dank

    PS: Vielleicht gab es die Frage ja schon mal, aber leider funzt ja derzeit die
    Suchfunktion nicht.



  • Stichwort THREAD



  • OK danke, ich bin auch schon auf PeekMessage gestoßen.
    Mal schauen ob ich es hinbekomme.



  • 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 gesucht 🙂 Dann 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 😃


Anmelden zum Antworten