Statusfenster in extra Thread?
-
Schönen guten Tag,
ich schreibe gerade ein programm, indem ich den Status eines Entpack-Vorgangs in einem Dialog mit einem Statusbalken anzeigen möchte.So starte ich den Dialog:
/* Fenstereigenschaften */ dlg.Create(); //Erzeugt das fenster dlg.m_statusBar.SetRange(0, 100); //ProzessBar größe definieren dlg.m_statusBar.SetPos(0); //Aktuelle Position dlg.m_statusBarText = "0 %"; dlg.UpdateData(false); //Updated das Fenster //if(IDOK == dlg.DoModal()) if(fShowWindow) { dlg.ShowWindow(SW_SHOW); } ... // Hier wird die funktion zum packen aufgerufen: pparams->result = zCompressFiles("", pparams->passwort, 0, false, 0, pparams->kommentar, (fn_prototype_RTInfo)status); ... dlg.DestroyWindow();
Hier ist die Statusfunktion die aufgerufen wird um die Statusinformationen ans Fenster weiterzugeben:
fn_prototype_RTInfo status(void) { int prozFiles, prozBytes, totalBytes = zGetOrderedBytes(), totalFiles = zGetOrderedFiles(); zGetRunTimeInfo(prozFiles, prozBytes); float erg = (float)((float)prozBytes/(float)totalBytes*100); char szText[6]; sprintf(szText, "%6.1f %%", erg); /* Fenstereigenschaften aktualisieren */ dlg.m_statusBar.SetPos((int)erg); //Aktuelle Position dlg.m_statusBarText = szText; CDataExchange *pDe = new CDataExchange(&dlg, FALSE); dlg.myDoDataExchange(pDe); dlg.UpdateData(false); dlg.RedrawWindow(); return 0; }
Soweit sogut.
Das Fenster wird angezeigt und auch der Prozessbalken macht was er soll.
Mein Problem ist nun aber, das ich während der Prozess läuft nicht auf abbrechen klicken kann. Sprich ich haben die ganze Zeit diese Störende Windows-Sanduhr.Meine Idee war es die funktionen in einem Thread aufzurufen, das ändert aber leider nichts daran.
Hat einer eine Idee was ich falsch mache, bzw. ändern muss, um wärend des Prozesses z.B. auf Abbrechen drücken zu können?MFG Staati
-
Verlagere doch lieber das "zCompressFiles" in einen eigenen Thread... und der schickt dann reglmäßig Nachrichten (WM_APP + x) an Dein Heuptfenster, damit Du den Status anzeigen kannst. Dann kannst Du auch auf den "Abbrechen" Button reagieren und kannst den Worker-Thread benachrichtigen, dass er aufhören soll (z.B. durch setzen einer globalen Variable)
-
Oh ja vielleicht war das nicht ganz klar...
Der ganze obere codeabschnitt läuft in dem Thread.die status funktion wird periodisch von zCompressFiles aufgerufen (also auch im Thread)
Achso, vielleicht auch nicht ganz unwichtig... Ich habe kein Hauptfenster.
Das Fenster ist das Hauptfenster.