Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Restart Dialog mit Counter

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
16.06.2005, 11:21 Uhr
GuenniAtWork



Hi,

Ich sitze grade an einem kleinen Dialog, der die Zeit bis zum Neustart runterzählen soll.
Desweiteren soll es die Mölichkeit geben Über einen Button den Neustart zu stoppen.

meine Frage ist, wie sage ich dem Dialog dass er den Counter starten soll wenn er angezeigt wird.

Habs mit OnShowWindow versucht, aber da bekomme ich den Dialog nicht angezeigt.
Aber die Funktion läuft.

Nochwas Nebenbei: Kann man Menberfunktionen in einem eigenen Thread laufen lassen?
--
Gruß GuenniAtWork
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.06.2005, 13:01 Uhr
Airdamn



1.) Den Counter kannst Du in OnInitDialog starten.
2.) Denke schon, bin mir aber nicht sicher...

Dieser Post wurde am 16.06.2005 um 13:01 Uhr von Airdamn editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.06.2005, 13:10 Uhr
GuenniAtWork



Auf die Idee bin ich auch schon gekommen.
Er führt die Counter-Funktion zwa aus, aber er zeigt mir den Dialog nicht an.
Ich hab auch versucht die Counter Funktion in einem eigenen Thread zu starten, aber scheinbar funktioniert das mit Methoden nicht.
Die counter-Funktion ist eine Methode meiner CRestartDlg Klasse.
--
Gruß GuenniAtWork
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.06.2005, 13:53 Uhr
Airdamn



Zeig mal Code...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.06.2005, 14:23 Uhr
GuenniAtWork



Jo mach ich.


C++:
void RestartSystem(int iWaitTime)
{
    CRestartDlg* pRestartDlg = new CRestartDlg(AfxGetApp()->GetMainWnd());
    pRestartDlg->SetRSTime(iWaitTime); //Zeit für Timer setzen
    pRestartDlg->DoModal();
             //pRestartDlg->ShowWindow(SW_SHOW); //Bekomme Ich Assert!!!!
}





C++:

BOOL CRestartDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // TODO:  hier zusätzliche Initialisierung hinzufügen.
    Restart();
    return TRUE;  // return TRUE unless you set the focus to a control
    // AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
}

void CRestartDlg::Restart(void)
{
    do
    {
        CStatic* pRestart = (CStatic*)GetDlgItem(IDC_ST_RESTART);
        CString sRSMessage = "Das System wird in ##s neu gestartet!";
        CString sTime;
        sTime.Format("%i",--m_iRestartTime);
        sRSMessage.Replace("##",sTime);
        pRestart->SetWindowText(sRSMessage);
        pRestart = NULL;
        delete pRestart;
        Sleep(1000);
    }while(!m_bCancel && m_iRestartTime > 0);

    if (!m_bCancel)
        AfxMessageBox("Neustart");
      //ExitWindowsEx(EWX_REBOOT | EWX_FORCEIFHUNG,NULL);
}

//m_bCancel wird TRUE, wenn Abbrechen gedrückt wurde




Bearbeitung:

Hatte noch vor Restart als eigenen Thread laufen zu lassen.
Hab ich aber noch nicht hinbekommen.
Vieleicht weil Restart eine Metode von CRestartDlg ist??




Dat isser!
--
Gruß GuenniAtWork

Dieser Post wurde am 16.06.2005 um 14:37 Uhr von GuenniAtWork editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.06.2005, 14:46 Uhr
Tommix



Hallo,
für sowas ist ein Timer gut: http://download.pearsoned.de/leseecke/VCPLUS6_21Tg/data/kap04.htm.
Für einen Thread bräuchtest Du eine statische Member-Funktion. Für Dein Problem ist ein Timer aber sinnvoller, würde ich sagen.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.06.2005, 15:05 Uhr
GuenniAtWork




Zitat von Tommix:

Für einen Thread bräuchtest Du eine statische Member-Funktion.



Hatte ich auch schon versucht.
Ist doch wenn ich static vor die Deklaration schreibe, oder braucht es mehr?
Hab immer Fehler bekommen.
--
Gruß GuenniAtWork

Dieser Post wurde am 16.06.2005 um 15:06 Uhr von GuenniAtWork editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.06.2005, 15:17 Uhr
~nobody
Gast


***Ist doch wenn ich static vor die Deklaration schreibe, oder braucht es mehr?
ne einfach static vor die deklaration. allerdings nur im .h file bei der afulösung in .cpp
kein static (sonst gibts nen fehler)

ich würde allerdings ne extrafunktion machen, die einfach die funktion, die du als thread starten möchtest aufruft, und dann diese "aufruffunktion" als thread starten:

.cpp
void run_restart()
{restart();}

.h
static void run_restart();
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.06.2005, 15:41 Uhr
GuenniAtWork




Vieleicht ist auch was in meinem Grundkonzept fehlerhaft.
1.Dialog Erstellt (Static für Restzeitanzeige und Button zum Abbrechen)
2.Funktion die den Dialog anzeigt. (RestartSystem)
3.Wenn Dialog angezeigt wird Funktion starten. (OnInitDialog oder sonstwo kA als Timer o. Thread)
4.Wenn Zeit abgelaufen Rechner Neustarten.
5.Wenn Abbrechen betätigt Funktion und Dialog beenden.

Ich vermute da ist Irgentwas verquer.

bis Jetzt ging entweder 2. oder 3.

Gibt es Da irgend ein Grundkonzept an das man sich halten sollte?
Ich bin doch sicher nicht der Erste der sowas programiert!


Zitat von ~nobody:

ich würde allerdings ne extrafunktion machen, die einfach die funktion, die du als thread starten möchtest aufruft



Hab ich mal gemacht.
Bekomme aber nen Assert in

C++:
void CRestartDlg::Restart(void)
{
    do
    {
        CStatic* pRestart = (CStatic*)GetDlgItem(IDC_ST_RESTART); //hier Assert
        CString sRSMessage = "Das System wird in ##s neu gestartet!";
        CString sTime;
        sTime.Format("%i",--m_iRestartTime);
        sRSMessage.Replace("##",sTime);
        pRestart->SetWindowText(sRSMessage);
        pRestart = NULL;
        delete pRestart;
        Sleep(1000);
    }while(!m_bCancel && m_iRestartTime > 0);

    if (!m_bCancel)
        AfxMessageBox("Neustart");
      //ExitWindowsEx(EWX_REBOOT | EWX_FORCEIFHUNG,NULL);
}


--
Gruß GuenniAtWork

Dieser Post wurde am 16.06.2005 um 15:49 Uhr von GuenniAtWork editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.06.2005, 16:22 Uhr
Tommix




Zitat von GuenniAtWork:
Hab immer Fehler bekommen.

Welche?
Was ~nobody schreibt, geht nicht - man kann aus einer statischen Funktion keine nicht-statische aufrufen. Man kann der statischen aber als Parameter einen Zeiger auf die aktuelle Instanz geben.
Wie schon erwähnt, ist ein Timer für Dein Problem aber die weitaus einfachere Methode.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: