Как контролировать использование процессора потоком во время выполнения?

0

Следующий код - это моя попытка сделать это. Однако я понимаю, что это не изящный подход. Может ли кто-нибудь указать мне в правильном направлении. Любой код-sampe приветствуется. Спасибо за чтение.

Изображение 174551

public partial class Form1 : Form
{
    BackgroundWorker worker = new BackgroundWorker();
    delegate void SetTextCallback(string text);

    public Form1()
    {
        InitializeComponent();
        worker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;
        worker.RunWorkerAsync(Convert.ToInt32(numericUpDown_CPU.Value));
    }

    void worker_ProgressChanged(Object sender, ProgressChangedEventArgs e)
    {
        double currentUtilization = (double)e.UserState;
        this.BeginInvoke(new SetTextCallback(SetText), new object[] { currentUtilization.ToString() });
        textBoxCurrentUtilization.Text = currentUtilization.ToString();
    }

    void worker_DoWork(Object sender, DoWorkEventArgs e)
    {
        int CPU_utilization = (int)e.Argument;

        while (true)
        {
            if (worker.CancellationPending)
                return;

            Thread.Sleep(CPU_utilization);
            int total = 0;
            Process p = Process.GetCurrentProcess();
            foreach (ProcessThread pt in p.Threads)
            {
                total += pt.TotalProcessorTime.Milliseconds;
                if (pt.Id == (int)AppDomain.GetCurrentThreadId())
                {
                    TimeSpan ts = pt.TotalProcessorTime;
                    double percentage = ((double)(ts.Milliseconds + 1) / total) * 100;
                    worker.ReportProgress(Convert.ToInt32(percentage), percentage);
                }
            }
        }
    }

    private void numericUpDown_CPU_ValueChanged(object sender, EventArgs e)
    {
        worker.CancelAsync();

        while (worker.IsBusy)
            Thread.Sleep(100);

        int desiredUtilization = Math.Abs(Convert.ToInt32(100 - numericUpDown_CPU.Value));
        worker.RunWorkerAsync(desiredUtilization); //restart worker
    }

    void SetText(string text)
    {
        this.textBoxCurrentUtilization.Text = text;
    }

}
  • 0
    Я не знаю, как точно указать, сколько процессора вы хотите, чтобы ваше приложение могло использовать. Я знаю, что вы можете установить приоритет конкретного потока, и это поможет снизить нагрузку на процессор. Документацию по темам можно найти здесь, а документацию по настройке Приоритета - здесь . Я хотел бы убедиться, что это то, что вы действительно хотите сделать, и иметь конкретный вариант использования, прежде чем сделать это.
  • 1
    Цикл Application.DoEvents (): ((
Показать ещё 6 комментариев
Теги:
multithreading
cpu-usage

1 ответ

1
Лучший ответ

Вы можете ограничить объем процессора для своего процесса, создав объект задания, где вы можете установить ограничения через SetInformationJobObject. Там вам нужно заполнить структуру структуры JOBOBJECT_CPU_RATE_CONTROL_INFORMATION.

Эта функция доступна только в версиях Windows> = 8. В качестве альтернативы установке жесткого ограничения вы также можете зарегистрировать обратный вызов при превышении частоты процессора. Там вы можете, например, приостановить свои рабочие потоки, если вы уверены, что они являются основным источником активности ЦП.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню