进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
(4)处理机分给线程,即真正在处理机上运行的是线程。
(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。
进程的运行我们可以通过任务管理器进行查看,当我们结束一个酷狗的进程时,我们可以发现酷狗的窗体关闭了,当我们再一次打开酷狗播放器时,我们又可以在任务管理器上看到进程信息,进程我们可以理解为一个程序的运行,程序的运行又是靠线程来执行的,当我们在酷狗上点击播放,暂停,继续时,这相当于把进程中某个线程给挂起或取消挂起,一个进程一般都需要一个以上的线程,线程的运行就是去执行一些方法去完成某个操作,同时多个线程的运行又是互不影响,就像一个公司做为一个进程,人作为线程完成个个任务,每个人做事都是不好互相影响的,这就造成了进程与线程的关系。
//将所有进程显示出来保存到listview中
private void button1_Click(object sender, EventArgs e)
{
/*标题和内容两项是不同的对象,内容是listviewitem对象中完成的,所以清除内容是在listviewl.items中清除的,而不是在 listview1.clear(),这样会清除标题和内容*/
listView1.Items.Clear();
Process[] p = Process.GetProcesses();//获取所有进程信息
foreach (Process itme in p)
{
ListViewItem lvi = new ListViewItem();//lvi为listview对象中的项,每一个lvi对象去表示一个进程内容
try
{
lvi.Text = itme.ProcessName;//必须要有首项,不写这,首项会为空
//lvi.SubItems.Add(itme.Id.ToString());
/*以下都是首项的子项*/
lvi.SubItems.Add(itme.Id.ToString());
lvi.SubItems.Add(itme.StartTime.ToString());
lvi.SubItems.Add(itme.PagedMemorySize64.ToString());
lvi.SubItems.Add(itme.PriorityClass.ToString());
}
catch
{
}
listView1.Items.Add(lvi);
}
}
//删除进程
private void 结束进程ToolStripMenuItem_Click(object sender, EventArgs e)
{
//找到选中的项的id,根据ID找到对应的进程
//selecteditems获取选中的项,subitems获取选中的项是子项
string id = listView1.SelectedItems[0].SubItems[1].Text;
Process p = Process.GetProcessById(Convert.ToInt32(id));//通过ID查找该进程
p.Kill();
//把选中的项移除掉
listView1.SelectedItems[0].Remove();
}
//线程控制图片切换显示
//开始切换图片
Thread t;
private void button3_Click(object sender, EventArgs e)
{
ThreadStart ts = new ThreadStart(cheakImg);
t = new Thread(ts);
t.IsBackground = true;
t.Start();
}
public void cheakImg()
{
Random r = new Random();
while (true)
{
Thread.Sleep(1000);
int i = r.Next(0, imageList1.Images.Count);
pictureBox1.Image = imageList1.Images[i];
textBox1.Text = i.ToString();
}
}
//终止线程
private void button4_Click(object sender, EventArgs e)
{
t.Abort();
}
//挂起线程 暂停
private void button5_Click(object sender, EventArgs e)
{
t.Suspend();
}
//取消挂起线程 继续
private void button6_Click(object sender, EventArgs e)
{
t.Resume();
}