티스토리 뷰

======================================================

안녕하세요 Doridori 입니다.

항상 새로운 주제를 가지고 부지런히 준비하고 싶은데 아무래도 출장지도 너무 멀고 숙소 생활을 하고 있는데 숙소에 노트북도 없고 하다보니 예제를 준비하기가 쉽지 않네요. 

하다보니 마지막 올린자료가 작년 10월인데 예전에 중국 갔을 때보다 더 늦은 시기에 올리게 되었습니다. ㅜㅠ

(중국 출장 시기에는 3개월 기준으로 입국 해야되서 3개월이었던것 같습니다.)

간만에 준비하다보니 예제를 만들어 놓은 시기도 길어서 강의에서 뜨문뜨문 헤메는 부분이 보이는데 너그러이 이해해 주시기바랍니다. 

자주 올리지도 못하는데도 불구하고 꾸준히 강의를 봐주시는 분들 정말 감사 드립니다. m(_._)m

올해는 강의도 강의이지만 조금 더 개인적인 취미로 다른 목표를 세우고 있는데 할 수 있을지 모르겠지만 열심히 준비해 보도록 하겠습니다.

모두 화이팅 하십시오!!

======================================================

 

59. PerformanceCounter (성능 카운터)

UI)

59. PerformanceCounter (성능 카운터) (UI).zip
0.58MB

 

Soruce)

59. PerformanceCounter (성능 카운터).zip
0.75MB

 

교재)

59. PerformanceCounter (성능 카운터).pdf
0.24MB

 

 

 

원래는 예전 강의에 한번씩 이야기를 했던것 같은데 parallel 관련 내용을 준비하고 있었습니다. 

헌데 준비를 하다보니 뭔가 시각적으로 표현이 되었으면 해서 cpu 성능을 표시하고 싶어 졌고, 그래서 윈도우 작업 관리자의 cpu 성능 부분을 프로그램으로 구현하려고 하였습니다. 

준비를 하면서 많은 예제들을 보았는데 확인 한 부분은 PerformanceCounter의 경우 작업관리자의 내용과는 다르다 라는 부분입니다. 

대신에 여기에 표시되는 성능카운터의 경우 window > 검색 > perfmon.msc 부분에서 확인 가능 합니다.

이 부분을 생각하면서 봐주시면 좋을 듯 합니다. 

해당 기능의 경우 프로그램상에서 모니터링을 할 수 있다면 자동으로 제어가 가능 하기 때문에 Thread Time을 조절 하거나 작업자를 호출해서 프로그램의 성능이나 안정성을 높힐 수 있다는 점에서 도움이 될듯 합니다. 

이런 류의 경우 생각해보면 할 수 있는 작업이 많습니다.

간단하게 성능을 볼 수 있는 프로그램을 구성 해 봤는데 Thread 종료하는 부분이나 기능 상으로 할 수 있는 작업들이 많기 때문에 살을 더 붙여서 이것저것 해 보는것도 좋을 듯 합니다. 

(위에서 말한 것처럼 성능에 따라 Thread Time을 변경 한다거나, 알림 Log를 남긴다거나 등등)

 

강의)

개인적으로 예제를 작성해놓고 정리한지가 오래되어 강의 내용이 살짝 왔다갔다 한점이 아쉽긴한데 애초에 편집을 하지않고 논테이크로 작업하고 있어서 그냥 가기로 하였습니다. =0=a

항상 말씀 드리지만 이런 API를 사용하는 기능의 경우 뭔가 다른 기술이 필요 한것이 아니고 API에 어떤 기능들이 있다라는것만 알고 사용하면 되기 때문에 높은 스킬보다는 활용에 대한 고민이 필요한 부분이 아닐까 생각해 봅니다. 

 

 

Source)

소스를 올리는 부분이 상당히 귀찮고 자리도 많이 차지하곤 하는데 이게 올려놓으면 복사해서 바로 사용하기도 좋고 질문을 남겨주시면 인터넷에서 소스를 바로 보고 내용 확인하기도 좋고 해서 안올릴수가 없네요. ㅎ

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace pCounter
{
    public partial class Form1 : Form
    {
        #region 
        private int iThreadTime = 2000;  // Thread 주기
        private bool bLoopState = true;  // while문 Loop 여부
 
        private bool bCheck = false;
 
        private PerformanceCounter cpu = new PerformanceCounter("Processor""% Processor Time""_Total"); // Total Processor의 정보
        private PerformanceCounter ram = new PerformanceCounter("Memory""Available MBytes"); // Total Memory 사용량 mb 정보
 
        //private string process_name;  // 현재 Program의 Process Name
        private PerformanceCounter prcess_cpu;
 
        List<PerformanceCounter> lpfCounter = new List<PerformanceCounter>();  // 논리 프로세서의 Process 정보를 저장
 
        #endregion
 
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
        /// <summary>
        /// Form Load Event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            // 1. Total에 대한 Performance Check Thread
            TotalPerformanceCheckThread();
 
 
            // 2.선택 Process에 대한 CPU Time Check
            // 논리 프로세서 카운트를 가져 옴 (논리 프로세스 ID가 0,1,2,3,4, . . . .)
            for (int i = 0; i < Environment.ProcessorCount; i++)
            {
                lpfCounter.Add(new PerformanceCounter("Processor""% Processor Time", i.ToString()));
            }
 
            // 현재 Program의 Process Name
            //process_name = Process.GetCurrentProcess().ProcessName;
 
            SelectProcessThread();  // 선택 Process CPU 사용량 Check Thread
        }
 
 
 
        #region 1.Total에 대한 Performance
 
        // Test 항목에 대한 log 표시
        private void btnTestLog_Click(object sender, EventArgs e)
        {
            // Total CPU, Total Memory, 가상 Process 개수 정도 표시
            Log(enLogLevel.Info, $"전체 CPU 사용량 : {string.Format("{0:N2}", cpu.NextValue())}%, Memory 사용 가능량 : {ram.NextValue()}mb, PROCESS_COUNT : {Environment.ProcessorCount}");
        }
 
        // Start End 시 화면에 표시하는 것만 막음
        private void btnPCStart_Click(object sender, EventArgs e)
        {
            bCheck = true;
        }
        
        // Start End 시 화면에 표시하는 것만 막음
        private void btnPCStop_Click(object sender, EventArgs e)
        {
            bCheck = false;
        }
 
        // Thread Function
        private void TotalPerformanceCheckThread()
        {
            Thread cpuCheck = new Thread(fCpuCheck);
 
            cpuCheck.Start();
        }
 
        // Thread
        private void fCpuCheck()
        {
            /*  필요 없고
            List<PerformanceCounter> lpCpu = new List<PerformanceCounter>();
 
            foreach (Process item in Process.GetProcesses())
            {
                lpCpu.Add(new PerformanceCounter("Process", "% Processor Time", item.ProcessName));
            }
 
            foreach (PerformanceCounter item in lpCpu)
            {
                //Log(enLogLevel.Info, $"Process Name : {item.CounterName}, CPU Counter : {item.NextValue()}");
            }
            */
            while (bLoopState)
            {
                if (bCheck)
                {
                    StringBuilder sb = new StringBuilder();
 
                    sb.Append($"Total : {string.Format("{0:N2}", cpu.NextValue())}%");
 
                    for (int i = 0; i < Environment.ProcessorCount; i++)
                    {
                        if (lpfCounter[i] != null)
                        {
                            sb.Append($", CPU {i} : {string.Format("{0:N2}", lpfCounter[i].NextValue())}%");
                        }
                    }
 
                    Log(enLogLevel.Info, sb.ToString());
 
                    /* Log Function 안으로 invoke 다 묶음
                    this.Invoke(new Action(delegate ()
                    {
                        Log(enLogLevel.Info, sb.ToString());
                    }));
                    */
                }
                Thread.Sleep(iThreadTime);
            }
        }
 
        #endregion
 
 
 
        #region 2.선택 Process에 대한 CPU Time Check
        // 현재 Process 정보를 reload
        private void btnCProcessLoad_Click(object sender, EventArgs e)
        {
            lboxProcessName.Items.Clear();
 
            lboxProcessName.Items.Add("pCounter");  // Process가 많을 경우 찾기 힘들어서 올려 놓음
 
            foreach (var oitem in Process.GetProcesses())
            {
                lboxProcessName.Items.Add(oitem.ProcessName);
            }
        }
 
        // List Select 값이 변경 될 경우 Process를 새로 등록
        private void lboxProcessName_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Process를 변경
            prcess_cpu = new PerformanceCounter("Process""% Processor Time", lboxProcessName.SelectedItem.ToString());
        }
 
        // 선택 Process Thread (Program 시작 시 실행)
        private void SelectProcessThread()
        {
            Thread selectcputhread = new Thread(fSelectProcess);
 
            selectcputhread.Start();
        }
 
        private void fSelectProcess()
        {
            // 시작 하면 Program이 죽을 때 까지 계속 체크
            while (bLoopState)
            {
 
                if (prcess_cpu != null)
                {
                    this.Invoke(new Action(delegate ()
                    {
                        Log(lboxProcessLog, enLogLevel.Info, $"Process Name : {prcess_cpu.InstanceName}  CPU 사용량 : {string.Format("{0:N2}", prcess_cpu.NextValue())}%");
                    }));
 
 
                }
                Thread.Sleep(iThreadTime);  // Thread 대기 Time
            }
        }
 
        #endregion
 
 
 
        #region 프로그램 부하를 올리기 위한 코드
      
        private Thread checkThread;
 
        private void btnCPUTestStart_Click(object sender, EventArgs e)
        {
            checkThread = new Thread(threadFunc);
            checkThread.IsBackground = true;
            checkThread.Start();
        }
 
        private static void threadFunc()
        {
            while (true)
            {
            }
        }
 
        private void btnCPUTestEnd_Click(object sender, EventArgs e)
        {
            checkThread.Abort();
            checkThread = null;
        }
        #endregion
        
 
 
        #region Log Viewer 
 
        // Log Level을 지정 할 Enum (44강 Tree View 참조)
        enum enLogLevel
        {
            Info,
            Warning,
            Error,
        }
 
        private void Log(enLogLevel eLevel, string LogDesc)
        {
            this.Invoke(new Action(delegate ()
            {
                DateTime dTime = DateTime.Now;
                string LogInfo = $"{dTime:yyyy-MM-dd hh:mm:ss.fff} [{eLevel.ToString()}] {LogDesc}";
                lboxLog.Items.Insert(0, LogInfo);
            }));
        }
 
        private void Log(DateTime dTime, enLogLevel eLevel, string LogDesc)
        {
            this.Invoke(new Action(delegate ()
            {
                string LogInfo = $"{dTime:yyyy-MM-dd hh:mm:ss.fff} [{eLevel.ToString()}] {LogDesc}";
                lboxLog.Items.Insert(0, LogInfo);
            }));
        }
 
        // List Box Control 추가
        private void Log(ListBox lbox, enLogLevel eLevel, string LogDesc)
        {
            this.Invoke(new Action(delegate ()
            {
                DateTime dTime = DateTime.Now;
                string LogInfo = $"{dTime:yyyy-MM-dd hh:mm:ss.fff} [{eLevel.ToString()}] {LogDesc}";
                lbox.Items.Insert(0, LogInfo);
            }));
        }
 
        #endregion
        
    }
}
 
cs
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함