我目前正在开发一些跟踪CPU使用情况的东西,但是一旦我启动了从CPU中提取数据的线程,屏幕就会变成空白,好像我开始了一个新程序。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Management.Instrumentation;
using System.Management;
using System.Collections.Specialized;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
Thread cpuData;
public Form1()
{
cpuData = new Thread(new ThreadStart(cpuDataThread));
cpuData.Start();
}
public void cpuDataThread()
{
ulong i;
i = 0;
try
{
ManagementClass cpuDataClass = new ManagementClass("Win32_PerfFormattedData_PerfOS_Processor");
while (true)
{
ManagementObjectCollection cpuDataClassCollection = cpuDataClass.GetInstances();
foreach (ManagementObject obj in cpuDataClassCollection)
{
if (obj["Name"].ToString() == "_Total")
{
i = Convert.ToUInt64(obj["C1TransitionsPersec"]);
}
}
Thread.Sleep(100);
}
}
catch (ThreadAbortException tbe)
{
}
progressBar1.Maximum = 100;
progressBar1.Minimum = 1;
progressBar1.Value = (int)i;
}
}
}
这只是我为个人使用而编写的一个程序,但是想让它正常工作,进度条也无法正常工作,以便获得一些帮助。
答案 0 :(得分:2)
您的构造函数未调用InitializeComponent()
,这是由WinForms设计器创建的方法。
答案 1 :(得分:0)
您可能还需要为线程提供以下属性(开始前方法之前):
cpuData.SetApartmentState(ApartmentState.STA);
cpuData.IsBackground = true;
关注你的第二个问题(进度条)。如果您想将数据传递给UI您需要使用Dispatcher,如下所示:
Dispatcher.Invoke((Action)delegate() { /* update UI */ });
答案 2 :(得分:0)
我用你的代码修改了一下,似乎有效:
您正在使用Win表单,因此我使用的是后台工作程序(" bkwCpuLoad")而不是手动线程。
为了适应这些值,我将最大值设置为10,000:
private void Form1_Load(object sender, EventArgs e)
{
progressBar1.Maximum = 10000;
progressBar1.Minimum = 0;
bkwCpuLoad.RunWorkerAsync();
}
private void bkwCpuLoad_DoWork(object sender, DoWorkEventArgs e)
{
ulong i;
i = 0;
try
{
ManagementClass cpuDataClass = new ManagementClass("Win32_PerfFormattedData_PerfOS_Processor");
while (true)
{
ManagementObjectCollection cpuDataClassCollection = cpuDataClass.GetInstances();
foreach (ManagementObject obj in cpuDataClassCollection)
{
if (obj["Name"].ToString() == "_Total")
{
i = Convert.ToUInt64(obj["C1TransitionsPersec"]);
}
bkwCpuLoad.ReportProgress((int)i);
}
Thread.Sleep(100);
}
}
catch (ThreadAbortException tbe)
{
}
}
private void bkwCpuLoad_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var perc = e.ProgressPercentage;
if (perc > progressBar1.Maximum)
perc = progressBar1.Maximum;
progressBar1.Value = perc;
try
{
progressBar1.Value--;
progressBar1.Value++;
}
catch
{
}
}
progressBar1.Value--
,progressBar1.Value++ bit
的出镜:在像你这样的情况下,有一件事情是理想的,就是进度条动画,这太慢了。但是:如果你 reduce 一个进度条值,它不是动画,而是直接绘制。
因此,设置值(动画开始),将其减少1(直接跳转到值)增加它再次使您的进度条基本上更快。 ; - )