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
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
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
@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.
@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...
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
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
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
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
Hallo Taki Haki,
ja
herbivore
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;
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 😁
OMG = Oh Mein Gott.
Da siehst du mal, was das Entfernen einer Endlosschleife alles für Auswirkungen haben kann...
btw versuch ma noch wenigstens in die schleifen ein Application.DoEvents einzubauen, damit die applikation nich alles blockiert
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
Nur nebenbei:
Original von Taki Haki
if (File.Exists(@"Date.ini") != true) { //...
@winSharp93
meine Macke 😁 ich finde das persönlich besser lesbar aber danke für den Hinweis