728x90
반응형
728x170
[TestProject 프로젝트]
▶ MainForm.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 반복 작업자
/// </summary>
private RepeatWorker statusWorker = null;
/// <summary>
/// 성능 헬퍼
/// </summary>
private PerformanceHelper performanceHelper = new PerformanceHelper();
/// <summary>
/// CPU 사용률 리스트
/// </summary>
private List<float> cpuRateList = new List<float>();
/// <summary>
/// 프로세스 큐
/// </summary>
private Queue<Process> processQueue = new Queue<Process>();
/// <summary>
/// 프로세스 CPU 사용률
/// </summary>
private float processCPURate = 10;
/// <summary>
/// 타겟 프로세스 카운트
/// </summary>
private int targetProcessCount = 3;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.startButton.Click += startButton_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 프로세스 구하기 - GetProcess()
/// <summary>
/// 프로세스 구하기
/// </summary>
/// <returns>프로세스</returns>
private Process GetProcess()
{
Process process = new Process();
process.EnableRaisingEvents = false;
process.StartInfo.FileName = "TestWorker.exe";
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
return process;
}
#endregion
#region 상태 처리하기 - ProcessStatus(parameter)
/// <summary>
/// 상태 처리하기
/// </summary>
/// <param name="parameter">매개 변수</param>
private void ProcessStatus(object parameter)
{
float currentCPURate = (uint)performanceHelper.GetCPURate();
Console.WriteLine("CURRENT CPU RATE {0}", currentCPURate);
this.cpuRateList.Add(currentCPURate);
if(this.cpuRateList.Count > 30)
{
this.cpuRateList.RemoveAt(0);
}
float averageCPURate = this.cpuRateList.Average();
Console.WriteLine("AVERAGE CPU RATE {0}", averageCPURate);
int averageProcessCount = (int)(averageCPURate / this.processCPURate);
Console.WriteLine("AVERAGE PROCESS COUNT {0}", averageProcessCount);
if(this.targetProcessCount > averageProcessCount)
{
int processCount = this.targetProcessCount - averageProcessCount;
int differenceProcessCount = processCount - this.processQueue.Count;
for(int i = 0; i < differenceProcessCount; i++)
{
Process process = GetProcess();
process.Start();
ProcessHelper.SetProcess(process, (uint)this.processCPURate);
this.processQueue.Enqueue(process);
}
}
else
{
int processCount = averageProcessCount - this.targetProcessCount;
while(this.processQueue.Count > 0 && processCount > 0)
{
Process process = this.processQueue.Dequeue();
if(process != null)
{
process.Kill();
}
processCount--;
}
}
Console.WriteLine("PROCESS QUEUE COUNT {0}", this.processQueue.Count);
}
#endregion
#region 시작하기 버튼 클릭시 처리하기 - startButton_Click(sender, e)
/// <summary>
/// 시작하기 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void startButton_Click(object sender, EventArgs e)
{
if(this.startButton.Text == "시작하기")
{
string processCPURateString = this.processCPURateTextBox.Text.Trim();
try
{
this.processCPURate = Convert.ToSingle(processCPURateString);
}
catch(Exception)
{
MessageBox.Show("프로세스당 CPU 사용률 (%)를 정확히 입력해 주시기 바랍니다.");
this.processCPURateTextBox.SelectAll();
this.processCPURateTextBox.Focus();
return;
}
string targetProcessCountString = this.targetProcessCountTextBox.Text.Trim();
this.processCPURateTextBox.ReadOnly = true;
this.targetProcessCountTextBox.ReadOnly = true;
try
{
this.targetProcessCount = Convert.ToInt32(targetProcessCountString);
}
catch(Exception)
{
MessageBox.Show("타겟 프로세스 수를 정확히 입력해 주시기 바랍니다.");
this.targetProcessCountTextBox.SelectAll();
this.targetProcessCountTextBox.Focus();
return;
}
Action<object> action = new Action<object>(ProcessStatus);
this.statusWorker = new RepeatWorker(action, null, 1000);
this.statusWorker.Start();
this.startButton.Text = "중단하기";
}
else
{
this.statusWorker.Stop();
this.statusWorker = null;
while(this.processQueue.Count > 0)
{
Process process = this.processQueue.Dequeue();
process.Kill();
}
this.processCPURateTextBox.ReadOnly = false;
this.targetProcessCountTextBox.ReadOnly = false;
this.startButton.Text = "시작하기";
}
}
#endregion
}
}
728x90
[TestWorker 프로젝트]
▶ Program.cs
using System;
using System.Threading;
namespace TestWorker
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 난수기
/// </summary>
private static Random _random = new Random();
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 스레드 처리하기 - ProcessThread()
/// <summary>
/// 스레드 처리하기
/// </summary>
public static void ProcessThread()
{
long number = 0;
while(true)
{
number += _random.Next(100, 1000);
if(number > 1000000)
{
number = 0;
}
}
}
#endregion
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
int processorCount = Environment.ProcessorCount;
for(int i = 0; i < processorCount; i++)
{
Thread thread = new Thread(() => { ProcessThread(); });
thread.Start();
}
}
#endregion
}
}
※ 윈도우즈 7에서는 작동하지 않는다.
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] Stopwatch 클래스 사용하기 (0) | 2019.11.22 |
---|---|
[C#/COMMON] 회문(Palindrome) 여부 구하기 (0) | 2019.11.20 |
[C#/COMMON] StreamWriter 클래스 : 콘솔 출력하기 (0) | 2019.11.20 |
[C#/COMMON] IDisposable 헬퍼 사용하기 (0) | 2019.11.19 |
[C#/COMMON] StringBuilder 클래스 : 확장 기능 사용하기 (0) | 2019.11.19 |
[C#/COMMON] CPU 부하 생성하기 (0) | 2019.10.16 |
[C#/COMMON] ServicePointManager 클래스 : DefaultConnectionLimit 정적 속성을 사용해 웹 요청 동시 접속 수 설정하기 (0) | 2019.10.12 |
[C#/COMMON] 사용자 계정 로그온 권한 조사하기 (0) | 2019.10.11 |
[C#/COMMON] 한글 문자열 확장 처리 기능 사용하기 (0) | 2019.10.07 |
[C#/COMMON] WebClient 클래스 : 외부 IP 주소 구하기 (0) | 2019.10.06 |
[C#/COMMON] 공백 문자열 압축하기 (0) | 2019.10.06 |
댓글을 달아 주세요