Progress Bar mit Verzögerung



  • toxor schrieb:

    Hmmmm ok danke für den Hinweis. Werd mal gucken ob ich das anders machen kann

    Solltest Du. Hast Du eine SDi-Anwendung? Dann leg im Doc die Variablen ab und übergib dem Thread einen Zeiger aufs Doc. Dann ist noch schön auf die Synchronisierung zu achten (Stichwort CCriticalSection, CSingleLock, etc.). Dann aus dem Thread eine Nachricht zum Neuzeichnen schicken. Beim Dialog hab ichs noch nicht gemacht. Ich denke aber, dass Du im Thread rechnen solltest und den String zur Anzeige als Parameter der Message mitschickst.

    toxor schrieb:

    keine Ausgabe im StaticText Feld IDC_STATIC_F gibt.
    Wenn ich genau dieses Static Text Feld schon beim start heraus ( nicht per Thread ) beschriften will, funktioniert das genauso wenig :

    Wann machst Du das denn? Existier deine Ansichtsklasse zu dieser Zeit schon? Zu dem anderen Problem: hast Du der Ansichtsklasse gesagt, dass sie sich neuzeichnen soll?



  • Also zb in der OnInitDialog meines Hauptdialoges :

    m_Fenster.Create(IDD_DIALOG1);
    m_Fenster.ShowWindow(SW_SHOW);
    
    CString strNeu;
    strNeu = "Hallo";
    m_Fenster.m_Per = strNeu;  // m_Per = CString Membervariable auf das Statictextfeld von CFenster
    SetDlgItemText(IDC_STATIC_F,m_Fenster.m_Per);
    

    Sollte da jetzt nicht mein Zweitdialog durch, Creat aufgerufen worden sein mit dem Text "Hallo" in der IDC_STATIC_F ?

    Leider sehe ich nix 😞

    Edit : Ok shit du hast recht, wenn ichs so mache :

    CString strNeu;
    strNeu = "Hallo";
    m_Fenster.m_Per = strNeu;  // m_Per = CString Membervariable auf das Statictextfeld von CFenster
    SetDlgItemText(IDC_STATIC_F,m_Fenster.m_Per); 	
    m_Fenster.Create(IDD_DIALOG1);
    m_Fenster.ShowWindow(SW_SHOW);
    

    dann gehts, hmmm gibts ne bessere alternative das Fenster neuzuzeichnen als UpdateData ?



  • toxor schrieb:

    hmmm gibts ne bessere alternative das Fenster neuzuzeichnen als UpdateData ?

    Du musst ja nicht das Fenster neuzeichnen, ggf. brauchst du nur dem Dialogfeldelemt sagen, dass es sich neuzeichnen soll. Wie soll man es sonst machen? Hast du Probleme mit Flackereffekten?



  • Also ich glaube so kommst du net weiter!

    CString strNeu;  //für was wird der string erstellt?
    strNeu = "Hallo"; //unnütz
    //m_Fenster.m_Per = strNeu;  //unnütz
    //besser:
    m_Fenster.m_Per = "Hallo";
    //SetDlgItemText(IDC_STATIC_F,m_Fenster.m_Per);// willst du wirklich den text in IDC_STATIC_F in deinem Hauptdialog setzen glaub ich nicht lass die zeile weg dann geht es auch     
    m_Fenster.Create(IDD_DIALOG1);
    m_Fenster.ShowWindow(SW_SHOW);
    

    Des weiteren beschäftige dich mal mit SendMessage, gib deinem Thread das Handle auf den Dialog von m_Fenster mit und sende dann eine UserMessage aus deinem Thread an den Dialog, dort kannst du dann auch mit UpdateData() arbeiten, alles andere is Mumpitz.

    Wenn noch fragen sind dann stellen

    Gruß Matthias



  • CTecS schrieb:

    Also ich glaube so kommst du net weiter!

    CString strNeu;  //für was wird der string erstellt?
    strNeu = "Hallo"; //unnütz
    //m_Fenster.m_Per = strNeu;  //unnütz
    //besser:
    m_Fenster.m_Per = "Hallo";
    //SetDlgItemText(IDC_STATIC_F,m_Fenster.m_Per);// willst du wirklich den text in IDC_STATIC_F in deinem Hauptdialog setzen glaub ich nicht lass die zeile weg dann geht es auch     
    m_Fenster.Create(IDD_DIALOG1);
    m_Fenster.ShowWindow(SW_SHOW);
    

    Des weiteren beschäftige dich mal mit SendMessage, gib deinem Thread das Handle auf den Dialog von m_Fenster mit und sende dann eine UserMessage aus deinem Thread an den Dialog, dort kannst du dann auch mit UpdateData() arbeiten, alles andere is Mumpitz.

    Wenn noch fragen sind dann stellen

    Gruß Matthias

    hab ich ihm doch schon geraten. Aber SendMessage im nem Thread is nicht gut. Das wartet doch auf ein return. Besser ist ::PostMessage zu verwenden. Ich geb dir Recht, einiges im geposteten Code ist sinnfrei.



  • toxor schrieb:

    Warum kann ich aus meinem Hauptdialog nicht auf StaticText Felder von anderen Dialogen zugreifen?

    Das geht auch nicht :

    CString strNeu;
    strNeu = "Hallo";
    m_Fenster.m_Per = strNeu;  // m_Per = CString Membervariable auf das Statictextfeld von CFenster
    SetDlgItemText(IDC_STATIC_F,m_Fenster.m_Per);
    

    Wenn ich genau dieses Beispiel in einem Textfeld von dem Hauptdialog ausführe, dann geht das schon, nur nicht in einem des anderen Dialogs, woran liegt das den ?

    SetDlgItemText(IDC_STATIC_F,m_Fenster.m_Per); greift auf IDC_STATIC_F des Hauptdialoges zu, wenn überhaupt, dann m_Fenster.SetDlgItemText(.....)



  • @jencas :
    Ohhh stimmt, da hab ich das vergessen, aber warum erkennt er das den überhaupt SetDlgItemText(IDC_STATIC_F,...) ? Ich hab nur in meinem neuen Dialog so eine ID ( In meinem Hauptdialog gibts IDC_STATIC_F nicht).

    Und warum funktioniert das dann andersherum schon ?

    ...
    SetDlgItemText(IDC_STATIC_F,m_Fenster.m_Per);    
    m_Fenster.Create(IDD_DIALOG1);
    m_Fenster.ShowWindow(SW_SHOW);
    

    @CTecS :
    naja ist ja nur ein Beispiel, weil ich ne ähnliche Stringübergabe im Thread verwende. Dein Tip mit SendMessage werde ich versuchen. Du meinst wenn SetDlgItemText(IDC_STATIC_F,...) weglasse dann gehts ? Also ehrlich gesagt funktioniert das von dir zitierte Beispiel so auch... hab ich oben aber auch geschrieben.

    @AndyDD :
    Ja der Weg mit PostMessage scheint der richtige zu sein. Allerdings scheint das doch wieder mit ziemlich viel Action verbunden zu sein und gucke ob ich nicht doch irgendwie ne leichtere Lösung finde.

    Leider kann ich erst wieder am Montag weiterbasteln 😞



  • Action? Du bist gut. Das Programmieren mit Threads is nun mal nicht so simpel. Man sollte sich immer einen sauberen Weg einfallen lassen. Wie CTecS schon sagte ist mancher Murcks sicher lauffähig, aber unter gewissen Konstellationen schmiert dir die Anwendung ab oder verhält sich komisch. Dann den Fehler zu finden ist noch viel komplizierter. Da hab ich auch Lehrgeld zahlen müssen. Trotzdem: nimm PostMessage... Es gibt nach eine andere Möglichkeit über Events zu kommunizieren, ist aber in meinen Augen für die Sache hier völlig übers Ziel hinaus. Also: einfacher wirst du es nicht realisieren können.



  • toxor schrieb:

    @jencas :
    Ohhh stimmt, da hab ich das vergessen, aber warum erkennt er das den überhaupt SetDlgItemText(IDC_STATIC_F,...) ? Ich hab nur in meinem neuen Dialog so eine ID ( In meinem Hauptdialog gibts IDC_STATIC_F nicht).

    SetDlgItemText() ist eine Methode von CDialog und damit auch von Deinem Hauptdialog. Und die IDC_s sind ja nicht Dialog-lokal sondern stehen in resource.h und sind somit überall bekannt, wo resource.h included wird und das ist nun mal bei jedem Dialog der Fall. Der Compiler kann nicht erkennen, dass Du einen falschen Parameter übergibst.



  • Hmm na gut, werds ausprobieren 🙂 , bin gespannt



  • Brauchst du eigentlich nicht gespannt zu sein, wenn Du das einmal mit den UserMessages und PostMessage(ich steite mich jetzt nicht mit AndyDD darüber´was nun besser is) verstanden hast, is das ganz einfach. Ich selbst benutze das system sogar wenn ich Funktionen anderer Dialoge aufrufen will (also von Dialog zu Dialog) und einfacher geht es nun wirklich nicht. Meist kannste so gemeinsame zugriffe auf Variablen verhindern, wodurch Du dir die Syncronisation ersparen kannst.

    nachmal für AndyDD (Kann mir das net verkneifen) 😉

    Postmessage = wird einfach versand ohne das ergebnis abzuwarten
    Sendmessage = wartet so lange bis die Message ausgeführt ist und kehrt dann mit dem Ergebnis zurück

    Je nach einsatzfalls is das eine oder das andere gut.

    Gruß Matthias



  • CTecS schrieb:

    Brauchst du eigentlich nicht gespannt zu sein, wenn Du das einmal mit den UserMessages und PostMessage(ich steite mich jetzt nicht mit AndyDD darüber´was nun besser is) verstanden hast, is das ganz einfach. Ich selbst benutze das system sogar wenn ich Funktionen anderer Dialoge aufrufen will (also von Dialog zu Dialog) und einfacher geht es nun wirklich nicht. Meist kannste so gemeinsame zugriffe auf Variablen verhindern, wodurch Du dir die Syncronisation ersparen kannst.

    nachmal für AndyDD (Kann mir das net verkneifen) 😉

    Postmessage = wird einfach versand ohne das ergebnis abzuwarten
    Sendmessage = wartet so lange bis die Message ausgeführt ist und kehrt dann mit dem Ergebnis zurück

    Je nach einsatzfalls is das eine oder das andere gut.

    Gruß Matthias

    Wir streiten uns doch nicht. Aber wenn du mal weiter vorn liest, so hab ich genau das schon angemerkt. Nehmen wir mal an dein Thread schickt eine Message per Sendmessage raus, das Dialogfeld existiert aber zu dieser Zeit (warum auch immer nicht mehr). Dann wird wahrscheinlich das Programmm ewig auf das Abarbeiten der Message warten. Deshalb, und das wird hier in den meisten Posts zum Thema Threads empfohlen, ist PostMessage zu verwenden.


Anmelden zum Antworten