现在的位置: 首页 > 综合 > 正文

Process&Thread 示例

2013年09月04日 ⁄ 综合 ⁄ 共 2851字 ⁄ 字号 评论关闭

Process类位于System.Diagnostics名称空间下,它专门用于完成系统进程的管理任务。可以在本地计算机上启动和停止进程,也可以向进程查询特定类型的信息。在远程计算机上,无法启动和停止进程,但可以查询进程的相关信息。在对进程进行操作时,首先要创建Process类的实例,其次还需要设置其对象成员的StartInfo属性,最后调用它的Start方法。
例.启动、停止和观察进程

1.  新建一个名为ProcessExample的Windows应用程序。
2.  从工具箱中将Process组件拖放到设计窗体。
3.  添加名称空间 :
using System.Diagnostics;
using System.Threading;
4. 添加“启动记事本”、“停止记事本”和“观察所有进程”三个按钮,并添加Click事件代码:
private void buttonStart_Click(object sender, EventArgs e)
{
    process1.StartInfo.FileName = "notepad.exe";
    //启动Notepad.exe进程.
    process1.Start();
}

private void buttonStop_Click(object sender, EventArgs e)
{
    //创建新的Process组件的数组,并将它们与指定的进程名称(Notepad)的所有进程资源相关联.
    Process[] myprocesses;
    myprocesses = Process.GetProcessesByName("Notepad");
    foreach (Process instance in myprocesses)
    {
        //设置终止当前线程前等待1000毫秒
        instance.WaitForExit(1000);
        instance.CloseMainWindow();
    }
}
private void buttonView_Click(object sender, EventArgs e)
{
    listBox1.Items.Clear();
    //创建Process类型的数组,并将它们与系统内所有进程相关联
    Process[] processes;
    processes = Process.GetProcesses();
    foreach (Process p in processes)
    {
         //由于访问Idle的StartTime会出现异常,所以将其排除在外
         if (p.ProcessName != "Idle")
         {
              //将每个进程名和进程开始时间加入listBox1中
              this.listBox1.Items.Add(
              string.Format("{0,-30}{1:h:m:s}", p.ProcessName, p.StartTime));
         }
    }
}

 

在System.Threading名称空间下, Thread类是用于创建和控制线程的,对线程的常用操作有:启动线程、终止线程、合并线程和让线程休眠等。
例.在程序中使用线程
1. 新建一个名为ThreadExample的Windows应用程序 。
2.向设计窗体拖放一个Timer组件。
3.名称空间:using System.Threading; 
4.字段声明: 
StringBuilder sb = new StringBuilder();
Thread thread1;
Thread thread2;
5. 代码:
private void AppendString(string s)
{
    lock (sb)
    {
         str.Append(s);
    }
}
public void Method1()
{
    while(true)
    {
        Thread.Sleep(100);   //线程休眠100毫秒
        AppendString("a");
    }
}
public void Method2()
{
    while(true)
 {
        Thread.Sleep(100);   //线程休眠100毫秒
        AppendString("b");
    }
}
6. 启动线程和终止线程按钮的Click事件中添加代码:
private void buttonStart_Click(object sender, EventArgs e)
{
    sb.Remove(0, sb.Length);
    timer1.Enabled = true;
    thread1 = new Thread(new ThreadStart(Method1));
    thread2 = new Thread(new ThreadStart(Method2));
    thread1.Start();
 thread2.Start();
}
private void buttonAbort_Click(object sender, EventArgs e)
{
    thread1.Abort();
    thread1.Join(10);
    thread2.Abort();
    thread2.Join(10);
}
7. timer1的Tick事件代码:
private void timer1_Tick(object sender, EventArgs e)
{
    if (thread1.IsAlive == true || thread2.IsAlive == true)
{
        richTextBox1.Text = sb.ToString();
    }
    else
    {
        timer1.Enabled = false;
    }
}

编译并执行,单击启动线程后,等一会再单击终止
线程,查看运行结果。

默认情况下,为了防止引起死锁等不安全因素,C#不允许在一个线程中直接操作另一个线程中的控件。但是在Windows应用程序中,为了在窗体上显示线程中处理的信息,我们可能需要经常在一个线程中引用另一个线程中的窗体控件。比较常用的办法是使用委托(delegate)来完成这个工作。

这个该怎么实现?

 

附,如何根据Handle来切换应用程序

Process[]   ps;  
  Process   ps1   =   new   Process();  
  ps   =   Process.GetProcesses();  
  for(int   i=0;i<=ps.Length-1;i++)  
  {  
  MessageBox.Show(""+ps[i].ProcessName);  
  if(ps[i].ProcessName=="QQ")  
  {  
  MessageBox.Show(""+ps[i].Handle);  
  return;  
  }  
  }  

这段代码在网上找到的,未验证。

抱歉!评论已关闭.