码迷,mamicode.com
首页 > 编程语言 > 详细

WinForm进程 线程

时间:2016-09-12 23:54:51      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

进程主要调用另一程序,线程 分配工作。

一、进程:

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。
Process 类,用来操作进程。 命名空间:using System.Diagnostics;

一个程序只有一个进程

Process.Start("calc"); //计算器
Process.Start("mspaint"); //画图
Process.Start("iexplore" , "http://www.baidu.com");//打开浏览器并指定地址

1、通过一个进程,打开指定的文件

 

1.创建进程对象
Process p = new Process();
2.创建一个StartInfo对象,是指定带盘符的路径。
ProcessStartInfo psi = new ProcessStartInfo(@"C:\user\.....);
3.进程指定及开始
p.StartInfo = psi; //指定路径
p.Start(); //开始进程

 


通过文件选择框让用户自己选择所需要打开的程序并打开:

 private void button1_Click(object sender, EventArgs e)
        {
            //设置选择文件的类型
            openFileDialog1.Filter = "应用程序|*.exe";
            //显示对话框并且判断用户有没有选中文件
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            { 
            //取文件路径
                string path = openFileDialog1.FileName;
                //创建一个新的进程
                Process p = new Process();
               

                //造进程启动信息  路径
                ProcessStartInfo ps=new ProcessStartInfo(path);
                //设置进程需要执行的文件信息
                p.StartInfo = ps;
                //启动进程
                p.Start();
                //关闭进程
                p.Kill();
            }
        }

 

列子:注销

 

string path=    System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName;  获取自身文件的路径 
 //注销
        private void button2_Click(object sender, EventArgs e)
        {
            //打开该程序
            //取该程序文件的路径
           // string path = Application.StartupPath;
        string path=    System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName;
            //造一个进程
        Process p = new Process();
            //造一个进程的启动信息
        ProcessStartInfo ps = new ProcessStartInfo(path);
            //设置进程启动信息
        p.StartInfo = ps;
            //启动进程
        p.Start();

            //关闭程序
            this.Close();
        }


需要调用别的程序,可以做一个进程

 

 二、线程

 

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。

区别:进程有自己独立的资源,线程共用资源。

Thread类, 命名空间:using System.Threading ;

程序默认只有一个主线程,如果做复杂处理,则会出现假死状态,因为一条线程同时只能做一件事

多线程的作用:同时做多件事情,节约时间,后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况。

同步:就只有一个线程  异步:多个线程(主要做这个) 

 程序出现假死就是 一个线程多用了

 

鼠标移动窗体
  //鼠标移动窗体   在picturebox里点击移动窗体         没有窗体边框也可移动     location(属性)
        private int x;
        private int y;

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            //鼠标按下执行的东西
            x=e.X;
            y = e.Y;

        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            //鼠标移动事件
            if (e.Button == System.Windows.Forms.MouseButtons.Left)//判断鼠标按下的是左键
            {
                this.Left = this.Left + (e.X - x);
                this.Top = this.Top + (e.Y - y);
            }
        }

 

 

 

 

创建线程:

开启新的线程执行哪个函数

 

创建线程:

开启新的线程执行哪个函数
  

  Thread th = new Thread( 里面写线程要操作的方法,方法名不含括号 );

标记这个线程准备就绪了,可以随时执行,CPU决定执行时间
  

  th.Start();

 

控件由主线程创建,新线程想要访问主线程资源,程序默认是不允许跨线程访问的。

取消跨线程访问限制
在界面Load事件里

  Control.CheckForIllegalCrossThreadCalls = false;

        private void button3_Click(object sender, EventArgs e)
        {
            //造一个线程
            Thread th = new Thread(test);
            //取消跨线程访问限制   在load里写

//执行线程 th.Start(); } //做一个方法 假死状态 private void test() { for (int i = 0; i < 3000; i++) { richTextBox1.Text += i.ToString(); } }

 

 

线程分为两种:

 

前台线程  -  只有所有的前台线程都关闭才能完成程序关闭。

后台线程  -  只要所有的前台线程都结束,后台线程则会自动结束。

两者的区别:应用程序必须运行完所有的前台线程才可以退出;

      而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。

 

 

设置th线程为后台线程  th . IsBackground = true ;

 

 

FormClosing 事件中:

  //判断新线程是否为null,如果为null,那就自动关闭了
  if(th != null)
  {
    //立即结束线程,但是结束后就不能再被重新Start了
    th.Abort(); 
  }

 

 执行带参数的函数:

如果该方法是带参数的,并且是放在线程里面执行的,要求该方法的参数必须是object类型的

Thread th = new Thread(Test);   //参数名不需要带括号
  th . IsBackground = true;
  th.Start(2000); //在这里传入Test函数所需要的参数

 

 这样函数中就需要强转:
  private void Test (object n)
  {

         int count=Convert.ToIn32(n);

     for (int i = 0; i < 3000; i++)
            {
                richTextBox1.Text += i.ToString();
            }


    
  }

 

WinForm进程 线程

标签:

原文地址:http://www.cnblogs.com/yp11/p/5862166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!