Eine Frage, auf die es scheinbar keine Antwort gibt...



  • Du startest einfach in OnInitDialog deinen Thread.



  • Programm Starten -> auf Verbinden drücken ➡ Fenster geht auf (nicht sichtbar, weil noch in InInitdialog()) -> Dialogfenster anzeigen (nicht modal) zum ausgeben der Statusanzeige -> Verbindungsaufbau(und Statusausgabe) -> Statusausgabe schließen -> Fenster geht fertig auf (soll heißen wird jetzt gezeichnet) ➡ Benutzername und Passwort eingeben -> auf Start drücken -> Passwort prüfen -> OK / Fehler

    Wie wär es damit? bye, Sigi



  • also ich würde erst mal mfc-grundlagen lernen....





  • Hallo,

    erst mal danke für die Antworten.

    Hatte zwar noch keine Gelegenheit, aber ich werde dieses Tutorial auf jeden Fall lesen. (Scheint ja Idiotensicher zu sein - cool 😉 )

    Habe jedoch in einem anderem Forum bemerkt, dass die Frage etwas unglücklich gestellt ist und mein Prob irgendwie missverstanden wird. Daher noch einmal:

    Das Problem ist NICHT, dass das Programm keine Rechenzeit mehr hat, sobald der Prozess läuft.
    Das Programm ist ein C++ Client für ein Perl-Chat-Programm. Der Perl Client wurde in eine .exe kompiliert, die nicht sichtbar ist.
    Das Programm soll nun eigentlich nur die Grafische Oberfläche bieten, da Perl mit TK etwas... sch*** ist.
    Hierfür arbeite ich mit WinExec(Perl_cli.exe - Parameter). Dieser Thread schreibt nun etwas in eine Datei und so weiter.
    Ich habe KEINE Probs mit dem Fortschrittsbalken oder dem Thread.
    Wie gesagt: Wenn ich einen Button reinschreibe "FANG JETZT AN" dann geht es ja.
    Mein Problem liegt da:
    Habe einen Hautpdialog. Dieser hat eine Button "am Server anmelden".
    Nach dem Klick geht auch ein Fenster mit Fortschrittsanzeige auf, wunderbar. NUR: Wo schreibe ich den Code hin, der Ausgefürt werden soll, wenn der Dialog fertig dargestellt ist? Ich habe im 2. Dialog kein OnInitDialog oder so, nur im Hauptfenster. Im 2. Dialog hab ich nur Connect_to_Server(), DoDataExchange() und OnCancel().
    Wie gesagt: Mache ich im 2. Dialog einen Button hin, "FANG JETZT AN" geht es ja...
    nur denke ich mir, das das sch*** ist. Er soll halt einfach nach dem man auf Die Schaltfläche "am Server anmelden" gedrückt hat, das Statusfenster bringen, und dann die Datei perl_client.exe starten, und dann am Server anmelden. OHNE dass der Benutzer noch 10 Buttons drücken muss, damit es weiter geht.

    Ich kenne es eben aus Java: Es geht los bei main()... wunderbar. Erst das, dann das,...

    // OK, das dürfte sich mit dem Tutorial Klären lassen:

    NUR bei C++ ?!? Wo geht wann was los? Ich hab keine Ahnung von den ganzen Dateien und wie und was? Kann es sein, dass C++ einfach alles gleichzeitig macht, ohne klaren Struckturen zu folgen? Ich kann jedenfalls keine erkennen..

    mfg
    trequ



  • Schreib in jede Methode eine MessaegeBox die dir ausgiebt in welcher Funktion du gerade bist. Oder geh dein Programm mit dem Debuger Schritt für Schritt durch.
    So solltest du hinter die Reihenfolge kommen 🙂



  • Du drückst den Button um das ganze zu starten

    Du startest einen Dialog.
    In der Funktion OnInitialise() (hier wird der Dialog noch nicht angezeigt) startest du einen eigenen Dialog der dir den Status ausgibt. Bsp.:

    CStartDlg sdlg;   //Im StartDlg wird der Ladefortschritt angezeigt
    sdlg->Create(IDD_DIALOG1,NULL);
    sdlg->ShowWindow(SW_SHOW);
    
    //Diese Funktion wird aufgerufen um den Ladefortschritt im StartDlg zu aktualisieren
    sdlg->SetPos(..);//Weitersetzen der Statusanzeige in dem Dialog
    
    sdlg->DestroyWindow();
    

    Die Funktion ist zu Ende, der Status-Dialog verschwindet, der eigendliche Dialog wird gezeichnet (nach der Funktion OnInitalise()), Der User Gibt Password und Username ein, drückt auf START(oder weiter), ....->weiter wie du glaubst.

    TSCHAU, SIGI



  • Fast feder Dialog hat ein OnInitDialog.

    Darum nennt man es ja OnInitDialog weil beim "initialisieren des Dlg ausgeführt"

    Solltest du diese Funktion nicht in deinem Dlg haben dann musst du sie von Assi erstellen lassen.
    Auf die DlgKlasse klicken (rechte Maustaste)
    Im Menü "Behandlungsroutine für Windowsnachrichten hinzufügen" und einfach ein doppelklicj auf die Nachricht "WM_INITDIALOG"



  • Hallo,

    der Ansatz scheint mir richtig, jedoch passiert folgendes wenn ich eine MessageBox in OnShow(), OnCreate(), OnInitDialog() oder OnDoModal() reinschreibe:
    -> man drückt den Button -> es kommt die MessageBox -> Fenster wird dargestellt. ⚠

    Dummerweise genau falsch rum. 😕 😞 😕
    (Was ich bräuchte: ->Button->Fenster wird dargestellt->Nachricht/Oder mein Code eben ausgeführt)

    Aber trotzdem Danke 👍

    mfg
    trequ



  • Starte in OnInitDialog() einen Timer,und rufe die MessageBox in OnTimer() auf.



  • Hallo,

    erst mal RIESEN DANK - es scheint zu funktionieren.

    Habe folgendes eingebunden:

    BOOL CConnect_to_Server::OnInitDialog() 
    {
    	MessageBox("init");		
    	SetTimer(1, 1000, NULL);
    
    	CDialog::OnInitDialog();
    
    	return TRUE;
    }
    
    void CConnect_to_Server::OnTimer(UINT nIDEvent) 
    {
    	MessageBox("Nachricht");
    	KillTimer(nIDEvent);
    	CDialog::OnTimer(nIDEvent);
    }
    

    Da der Dialog jedoch gleich gezeichnet ist, sollte es doch reichen, nur SetTimer(1, 10, NULL); zu schreiben - also 10ms, oder vieleicht 100.
    Wenn ich das jedoch mache, lässt sich der Timer nicht mehr beenden, und ich werden von den MessageBoxen "überflutet".
    Mache ich was falsch, oder ist einfach 1000ms das Minimum?

    Danke.

    mfg
    trequ



  • #define IDT_TIMER1 1 //Am besten über Menü->Ansicht->Ressourcensymbole 
    ------------------------------------
    SetTimer(IDT_TIMER1, 20, NULL); 
    -------------------------------------
    void CConnect_to_Server::OnTimer(UINT nIDEvent)  
    { 
       switch(nIDEvent)
       {
          case IDT_TIMER1: MessageBox("Nachricht"); 
                           KillTimer(nIDEvent); //besser KillTimer(IDT_TIMER1); 
                           break;
          default:         break;
       }
    
       CDialog::OnTimer(nIDEvent); 
    }
    

    Ich hab mal gelesen das 20ms die kleinste Zeit ist die er verarbeiten kann.
    Du kannst aber auch 0 oder 1 schreiben, das macht der Funktion nichts.

    Diese Funktion hat nur einen Hacken, Sie wird nur dann ausgeführt wenn der Prozessor nicht zu sehr ausgelastet ist (wird bei dir nicht der Fall sein), ansonsten wird die Ausführung auf später verschoben.



  • Hallo,

    funktioniert seltsamer weise nicht. Habe da jetzt noch eine MSG Box reingeschrieben und einen 2. Kill:

    BOOL CConnect_to_Server::OnInitDialog() 
    {
    	MessageBox("init");		
    	SetTimer(IDT_TIMER1, 5000, NULL);
    	MessageBox("wieder da");
    
    	CDialog::OnInitDialog();
    
    	return TRUE;
    }
    
    void CConnect_to_Server::OnTimer(UINT nIDEvent)   
    {  
    	MessageBox("Nachricht");  
             KillTimer(IDT_TIMER1);
    	KillTimer(nIDEvent);
    
        CDialog::OnTimer(nIDEvent);  
    }
    

    Selbst wenn ich die Zeit auf 5 Sek. stelle, kommt nach 5 Sek. noch eine Dialogbox mit "Nachricht".

    Ich kriege im Moment "init" dann nach Ok "wieder da" und dann alle 5 Sek - auch ohne OK bei "wieder da" das Fenster "Nachricht"

    Irgendwie läuft der Timer zwar richtig, aber er beendet sich nicht.

    mfg
    trequ



  • mach den von mir vorher vorgeschlagenen switch-Block, denn vielleicht läft der Timer durch irgend einen anderen Aufruf. Oder mach eine if-Abfrage.

    if(nIDEvent == IDT_TIMER1)
    {
       KillTimer(IDT_TIMER1);
    }
    CDialog::OnTimer(nIDEvent);
    


  • Hallo,

    Habe das jetzt probiert:

    BOOL CConnect_to_Server::OnInitDialog() 
    {
    	MessageBox("init");		
    	SetTimer(IDT_TIMER1, 1000, NULL);
    
    	CDialog::OnInitDialog();
    
    	return TRUE;
    }
    
    void CConnect_to_Server::OnTimer(UINT nIDEvent)   
    {  
    	if(IDT_TIMER1 == nIDEvent)
    	{
    		MessageBox("Nachricht");  
    		KillTimer(IDT_TIMER1);
    		KillTimer(nIDEvent);
    	}
    	else
    	{
    		MessageBox("andere Nachricht");
    	}
        CDialog::OnTimer(nIDEvent);  
    }
    

    selber Fehler.

    Bin jetzt dahinter gekommen:

    schreibe ich:

    ....
    MessageBox(...);
    KillTimer(...);
    ...
    geht es nicht. 😡

    ...
    KillTimer(...);
    MessageBox(...);
    ...
    Dagegen geht aber. 😮

    Ich muss das jetzt nicht verstehen oder?
    Der Timer wird irgendwie durch KillTimer nicht beendet, wenn ein Code davor steht, auch wenn es keine MessageBox ist. 😕 😕
    mfg
    trequ



  • Ich denke das in der Zeit die du benötigst um die MessageBox wegzuklicken sich einige Aufrufe von OnTimer ansammeln.


Anmelden zum Antworten