Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1551 | Anzahl registrierter User: 1841 | Besucher online: 268
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

CPU Last von mehreren CPUs überwachen


Autor: Tim Hartwig
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 8787
  
Kick it on dotnet-kicks.de  

Beschreibung:

Mit dieser Klassen kann man die CPU Last von einer oder mehreren CPUs überwachen.

Wichtig: Da diese Klasse die CPUs in eigenen Threads überwacht, muss drauf geachtet werden das wenn man die Werte an die Form übergeben will, man mit Delegates und Invoke arbeiten muss. Ein Beispiel dazu findet man in meinem Kommentar.


Abgelegt unter: CPU, Hardware, Last, Load, Thread.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Diagnostics;
using System.Threading;

/// <summary>
/// Mit dieser Klassen kann man die CPU Last von einer oder mehreren CPUs überwachen.
/// </summary>
public class CPULoadWatcher
{
    /// <summary>
    /// Dieses Event wird von jedem hinzugefügtem Watcher in den vorgegebenen
    /// Zeitintervallen aufgerufen und übergibt die aktuelle CPU Last.
    /// Hinweis: Der Parameter e wird von einem anderen Thread aus übergeben.
    /// </summary>
    public event CPULoadChangedEventHandler CPULoadChanged;
    public delegate void CPULoadChangedEventHandler(CPULoadEventArgs e);
    private System.Collections.Generic.Dictionary<ushort, Watcher> WatcherCollection = new System.Collections.Generic.Dictionary<ushort, Watcher>();

    /// <summary>
    /// Fügt einen Watcher für eine CPU hinzu
    /// </summary>
    /// <param name="CPU">Die Nummer der CPU die überwacht werden soll</param>
    /// <param name="Interval">Gibt an in welchen Zeitabständen (ms) die CPU Last ausgelesen werden soll. Empfohlen: 1000ms</param>
    public void AddWatcher(ushort CPU, int Interval)
    {
        if (WatcherCollection.ContainsKey(CPU) == false)
        {
            Watcher W = new Watcher(CPU, Interval);
            W.Changed += OnCPULoadChanged;
            WatcherCollection.Add(CPU, W);
            W.Start();
        }
    }

    /// <summary>
    /// Entfernt einen Watcher für eine CPU
    /// </summary>
    /// <param name="CPU">Die Nummer der CPU dessen Watcher entfernt werden soll</param>
    public void RemoveWatcher(ushort CPU)
    {
        if (WatcherCollection.ContainsKey(CPU) == true)
        {
            WatcherCollection[CPU].Abort();
            WatcherCollection.Remove(CPU);
        }
    }

    private void OnCPULoadChanged(CPULoadEventArgs e)
    {
        if (CPULoadChanged != null)
        {
            CPULoadChanged(e);
        }
    }

    private class Watcher
    {
        private ushort mCPU = 0;
        private int mInterval;
        private bool mAbort = false;
        private PerformanceCounter PerfCounter;
        public event ChangedEventHandler Changed;
        public delegate void ChangedEventHandler(CPULoadEventArgs e);

        public Watcher(ushort CPU, int Interval)
        {
            mCPU = CPU;
            mInterval = Interval;
        }

        public void Start()
        {
            PerfCounter = new PerformanceCounter("Processor", "% Processor Time", mCPU.ToString());
            System.Threading.Thread T = new System.Threading.Thread(Watch);
            T.Start();
        }

        public void Abort()
        {
            mAbort = true;
        }

        private void Watch()
        {
            do
            {
                if (mAbort == true)
                {
                    mAbort = false;
                    break;
                }

                if (Changed != null)
                {
                    Changed(new CPULoadEventArgs(mCPU, PerfCounter.NextValue()));
                }
                System.Threading.Thread.Sleep(mInterval);
            }
            while (true);
        }
    }

    public class CPULoadEventArgs
    {
        private ushort mCPU;
        private float mCPULoad;

        public ushort CPU
        {
            get { return mCPU; }
        }

        public float CPULoad
        {
            get { return mCPULoad; }
        }

        public CPULoadEventArgs(ushort CurrCPU, float CurrCPULoad)
        {
            mCPU = CurrCPU;
            mCPULoad = CurrCPULoad;
        }
    }
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Tim Hartwig schrieb am:  17.12.2006 18:03:56

Hier ein Beispiel für die Anwendung der Klasse mit Delegate und Invoke für einen gültigen Threadübergriff.

private CPULoadWatcher CLW = new CPULoadWatcher();
private delegate void CWLDelegate(CPULoadWatcher.CPULoadEventArgs e);

private void Form1_Load(object sender, EventArgs e)
{
CLW.CPULoadChanged += new CPULoadWatcher.CPULoadChangedEventHandler(CLW_CPULoadChanged);
CLW.AddWatcher(0, 1000);
}

private void CLW_CPULoadChanged(CPULoadWatcher.CPULoadEventArgs e)
{
this.Invoke(new CWLDelegate(ShowValue), new Object[] { e });
}

private void ShowValue(CPULoadWatcher.CPULoadEventArgs e)
{
this.Text = e.CPULoad.ToString();
}


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.