0

システム トレイのアイコンを更新する小さくてシンプルな C# アプリケーションがあります。これを使用して、CPU 使用率をグラフィカルに表示します。アプリケーションはうまく機能します。邪魔にならないように、ウィンドウを非表示にしてタスクバーに表示しません。

私の問題は、しばらくの間うまくいくということです。多くの場合、数時間。しかし、それは不思議なことに終了します。警告はありません。何もない。アイコンがなくなり、プログラムが実行されなくなりました。さまざまな条件下でデバッガーでプログラムをテストしたので、それだけではないと思います。私が見逃している明らかなものはありますか?プログラムでエラーが発生して終了した場合、フォームが非表示の場合にメッセージが表示されるはずですか? 「キープアライブ」メッセージまたは処理する必要があるものはありますか?

コードの関連セクションは次のとおりです。

public Form1()
{
    InitializeComponent();

    trayIcon = new NotifyIcon();
    trayIcon.Text = "CPU Utilization";
    trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);

    trayIcon.Visible = true;

    update = new Thread(new ThreadStart(UpdateCPU));
    update.Start();
}

protected override void OnLoad(EventArgs e)
{
    Visible = false;
    ShowInTaskbar = false;

    base.OnLoad(e);
}

private void UpdateCPU()
{
    Bitmap bm = new Bitmap(32, 32);
    Graphics g = Graphics.FromImage(bm);

    while (true)
    {
        g.FillRectangle(new SolidBrush(c3), 17, 17, 15, 15);
        trayIcon.Icon = System.Drawing.Icon.FromHandle(bm.GetHicon());

        Thread.Sleep(1000);
    }
}

どんな助けでも大歓迎です!

4

2 に答える 2

1

Unhandled Exception Handler を追加することをお勧めします

winforms コントロールのグローバル例外処理

例外がスローされ、プログラムが終了する可能性があります。

次に、ロギングを導入して、例外が何であったかをログに記録します。個人的にはNLogの方が好きです。

非 UI スレッドからスレッド間例外を受け取ることなく、trayIcon を更新できることに少し驚いています。

于 2012-06-27T21:32:53.453 に答える
0

ドキュメントは Viktor Latypov のコメントに同意しているようです。次のようなことを行う必要があります。

Icon newIcon = Icon.FromHandle(bm.GetHicon());

trayIcon.Icon = newIcon;

DestroyIcon(newIcon.Handle);
于 2012-06-27T21:32:27.067 に答える