Laden...

[erledigt] Mein Programm läßt den Rechner nicht Herunterfahren, Neustarten usw.

Erstellt von Taki Haki vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.131 Views
Taki Haki Themenstarter:in
168 Beiträge seit 2005
vor 16 Jahren
[erledigt] Mein Programm läßt den Rechner nicht Herunterfahren, Neustarten usw.

Hallo,

ich habe nen ganz komisches Problem 🤔

Habe nen kleines Programm gebastelt was mit die Tage bis zu einem bestimmten Datum herunterzählt. Jede Stunde zeigt es dann diesen Countdown per BaloonTip (SystemtrayIcon) an.

Ich lasse das Programm immer im Autostart starten und nun das komische. Wenn ich meinen PC herunterfahren möchte passiert einfach nichts. Es bleibt alles so wie vorher als wenn das herunterfahren oder neustarten einfach ignoriert wird.

Nachdem ich dann den DateCounter beendet habe. Funktioniert alles wieder wunderbar. Rechner fährt runter ohne Probleme.

Hier habe ich den Code zu dem Programm. Könnte es vielleicht an dem Timer liegen?

Habe als Interval 3600000 eingestellt.


namespace ThesisCounter
{
    public partial class ThesisCounter : Form
    {
        private bool bMenuClose;
        private string strMessage;
        
        public ThesisCounter()
        {
            InitializeComponent();

            this.bMenuClose = false;
            this.strMessage = "";

            if (File.Exists(@"Date.ini") != true)
            {
                this.notifyIcon.ShowBalloonTip(10, "Taki Haki's ThesisCounter", "Date.ini wurde nicht gefunden!", ToolTipIcon.Info);
            }
            else
            {
                this.timer.Start();
                this.ShowBallonTip();
            }  
        }

        private void ShowBallonTip()
        {
            if (File.Exists(@"date.ini") == true)
            {
                FileStream fs = new FileStream(@"Date.ini", FileMode.Open, FileAccess.Read);
                StreamReader sr = new StreamReader(fs);

                DateTime dateNow = DateTime.Now;
                DateTime dateEnd = Convert.ToDateTime(sr.ReadLine());
                string message = sr.ReadLine();

                sr.Close();
                fs.Close();

                int counter = 0;

                while (true)
                {
                    if (dateNow.Date == dateEnd.Date)
                    {
                        break;
                    }
                    else
                    {
                        dateNow = dateNow.AddDays(1);
                        counter++;
                    }
                }

                //Ausgabe im SystemTray per BalloonTip
                this.notifyIcon.ShowBalloonTip(10, "Taki Haki's DateCounter", "Noch " + counter + " Tage " + message, ToolTipIcon.Info);
            }
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            if (this.strMessage != "")
            {
                FileStream fs = new FileStream(@"Date.ini", FileMode.Create, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(this.monthCalendarEnd.SelectionStart.Date);
                sw.WriteLine(this.strMessage);

                sw.Close();
                fs.Close();

                this.Hide();
                this.ShowBallonTip();
            }
            else
            {
                MessageBox.Show("Es wurde keine Nachricht angegeben!", "Fehler");
            }
        }

        private void ThesisCounter_Resize(object sender, EventArgs e)
        {
            if (FormWindowState.Minimized == WindowState)
            {
                this.Hide();
            }
        }

        private void notifyIcon_DoubleClick(object sender, EventArgs e)
        {
            this.Show();
            this.WindowState = FormWindowState.Normal;
        }

        private void showCounterToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.bMenuClose = true;
            this.Close();
        }

        private void ThesisCounter_Load(object sender, EventArgs e)
        {
            this.monthCalendarEnd.TodayDate = this.monthCalendarEnd.TodayDate.AddMonths(3);
        }

        private void ThesisCounter_Shown(object sender, EventArgs e)
        {
            this.Hide();
        }

        private void testToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (sender == this.contextMenuStrip.Items[0]) 
            this.ShowBallonTip();
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            this.ShowBallonTip();
        }

        private void buttonMessage_Click(object sender, EventArgs e)
        {
            MessageForm messageForm = new MessageForm();
            messageForm.ShowDialog();
            
            if (messageForm.strMessage != "")
            {
                this.strMessage = messageForm.strMessage;
            }
        }
    }
}

mfg Taki

P
56 Beiträge seit 2006
vor 16 Jahren

Das Problem hatte ich auch mal. Ich glaub, ich habs mit einem Eventhandler auf

Application.ApplicationExit +=new EventHandler(Application_ApplicationExit);

gelöst. Bin mir da aber nicht so sicher.
Im Eventcode wurde dann der Thread beendet.

Vielleicht gehts auch über die FormClosed oder FormClosing-events

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Taki Haki,

wo machst du denn überhaupt was, um den Rechner runterzufahren? Such mal nach shutdown hier im Forum und poste die Treffer, die dir bei der Lösung geholfen haben.

herbivore

Taki Haki Themenstarter:in
168 Beiträge seit 2005
vor 16 Jahren

@herbivore

das Programm soll nicht den Rechner runterfahren. Das Problem ist das mein Rechner nicht mehr runterfährt oder neustartet wenn das Programm läuft.

Ich klicke Start->Herunterfahren und nichts passiert als wenn ich garnichts gemacht hätte. Erst nachdem ich mein programm per Hand beschlossen haben funktioniert das runterfahren bzw. neustarten usw.

Das genau ist mein Problem aber ich schaue erstmal nachdem was Phaiax geschrieben hat.

738 Beiträge seit 2007
vor 16 Jahren

@herbivore,

ich glaube, das problem von Taki Haki ist, dass der benutzer den PC nicht per runterfahren kann, also quasi "händisch". Das Programm soll den PC ja nicht herunterfahren, aber es hindert den Benzuer offenbar daran...

Taki Haki Themenstarter:in
168 Beiträge seit 2005
vor 16 Jahren

Genau nin das ist es 😁

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Taki Haki,

ok, hatte ich falsch verstanden.

Schau mal, ob du das WindowsFormsApplicationBase.Shutdown-Ereignis überhaupt bekommst und wenn ja, dann schließe mal deine Anwendung, wenn du das Ereignis bekommst.

herbivore

345 Beiträge seit 2005
vor 16 Jahren

Ich würd sagen, Du ziehst einfach das ganze System runter. Da ist es schon verwunderlich, daß "nur" das runterfahren nicht klappt...

while (true)
                {
                    if (dateNow.Date == dateEnd.Date)
                    {
                        break;
                    }
                    else
                    {
                        dateNow = dateNow.AddDays(1);
                        counter++;
                    }
                }

oder kannst Du sicher ausschließen, daß dateEnd.Date nicht erreicht wird?

Mein Haus, mein Viertel, mein Blog

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Taki Haki,

ok, so genau hatte ich mir den Code nicht angesehen. while (true) ist natürlich Teufelswerk. Siehe [FAQ] Warum blockiert mein GUI?

herbivore

Taki Haki Themenstarter:in
168 Beiträge seit 2005
vor 16 Jahren

Habe das geändert


DateTime dtNow = DateTime.Now;

while (dtNow.Date != dtDeadline.Date)
{
        dtNow = dtNow.AddDays(1);
        counter++;
}

Daran liegt es aber nicht, also rechner fährt immer noch nicht runter X(

@herbivore

Wie kann ich das WindowsFormsApplicationBase.Shutdown abfragen? Muss ich da nen EventHandler per Hand erstellen?

mfg Taki

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Taki Haki,

ja

herbivore

B
1.529 Beiträge seit 2006
vor 16 Jahren
DateTime dtNow = DateTime.Now;  
  
while (dtNow.Date != dtDeadline.Date)  
{  
        dtNow = dtNow.AddDays(1);  
        counter++;  
}  

OMG. Was ist das denn? Willst du die Anzahl der Tage bis zum Auslaufen einer Frist ermitteln?

Wie wäre es denn mit:

int days = (dtDeadline.Date - DateTime.Now.Date).Days;
Taki Haki Themenstarter:in
168 Beiträge seit 2005
vor 16 Jahren

ehm OMG ?

Ober-Mutig-Gehandhabt? 😁

Ja ne habe


DateTime dtNow = DateTime.Now;

while (dtNow.Date != dtDeadline.Date)
{
        dtNow = dtNow.AddDays(1);
        counter++;
}

durch


int days = (dtDeadline.Date - DateTime.Now.Date).Days;

ersetzt und schon funktioniert das ganze, also das herunterfahren.

Danke Borg 😁

B
1.529 Beiträge seit 2006
vor 16 Jahren

OMG = Oh Mein Gott.

Da siehst du mal, was das Entfernen einer Endlosschleife alles für Auswirkungen haben kann...

D
222 Beiträge seit 2004
vor 16 Jahren

btw versuch ma noch wenigstens in die schleifen ein Application.DoEvents einzubauen, damit die applikation nich alles blockiert

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo DarkShadow81,

Taki Haki hat die Schleife ganz entfernt und dadurch die Blockierung beseitigt.

DoEvents ist wie in [FAQ] Warum blockiert mein GUI? beschrieben, mit diversen Nachteilen behaftet und sollte deshalb eher nicht verwendet werden, um Blockierungen aufzuheben.

herbivore

D
222 Beiträge seit 2004
vor 16 Jahren

ah ok, dann guck ich mir ma den thread an, thx

5.742 Beiträge seit 2007
vor 16 Jahren

Nur nebenbei:

Original von Taki Haki

  
if (File.Exists(@"Date.ini") != true)  
{  
   //...  
  

Siehe:
[Tipp] Anfängerfehler == true / == false

Taki Haki Themenstarter:in
168 Beiträge seit 2005
vor 16 Jahren

@winSharp93

meine Macke 😁 ich finde das persönlich besser lesbar aber danke für den Hinweis