WinForm 进程、线程

摘要:
线程类,命名空间:usingSystem Threading;默认情况下,程序只有一个主线程。如果完成了复杂的处理,它将被挂起,因为一个线程只能同时执行一件事。将th线程设置为后台线程th。IsBackground=true;该控件由主线程创建。新线程希望访问主线程资源,程序默认不允许跨线程访问。取消接口Load事件CheckForIllegalCrossThreadCalls=false中的跨线程访问限制;在表单结束时event://Judge新线程是否为空。如果为空,则If(th!

一、进程

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。

可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体

Process 类,用来操作进程。

命名空间:using System.Diagnostics;

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

(一)通过一个进程,打开指定的文件:

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 psf = new ProcessStartInfo(path);
                //设置该进程的执行信息
                p.StartInfo = psf;
                //启动进程
                p.Start();
            }         
        }

例子:注销

//这个path就是你要调用的exe程序的绝对路径

string path = Application.StartupPath;

//获取自身exe或dll的文件名路径

string s = 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();
        }

例:窗口实现鼠标拖动

        private int x;
        private int y;

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            //鼠标点击时的XY坐标
            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);
            }
        }    


二、线程

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

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

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

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

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

创建线程:

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

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

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

  th.Start();

线程分为两种:

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

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

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

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

设置th线程为后台线程

  

  th . IsBackground = true ;

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

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

  Control.CheckForIllegalCrossThreadCalls = false;

FormClosing 事件中:

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

执行带参数的函数:

如果线程执行的方法需要参数那么要求这个参数必须是object类型

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

这样函数中就需要强转:
  private void Test (object s)
  {
    string ss = (string) s ;
    ......
  }

免责声明:文章转载自《WinForm 进程、线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Unity进阶之:Shader渲染uni-app v-bind绑定属性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[安卓网络入门] 获取天气

实验要求 本次实验,通过调用http://www.weather.com.cn/data/sk/101010100.html制作天气查询的app。 实验过程 我是利用了okhttp这个第三方库,通过post请求,向上面的天气查询接口查询信息, 然后返回的结果,通过handler送到ui线程。因为安卓不允许无关线程修改ui界面。 对于json字符串的解析,可...

IO与线程状态

这几天在看IO和NIO, 说IO是阻塞的,当多个IO访问服务器时,发生阻塞的时候,CPU要不停的轮询每个IO的线程,看哪个IO的阻塞解除。会浪费CPU资源。 然后我看了线程的状态分类,专门有人说过阻塞和同步是不一样的。 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法...

winform窗体 【打开多个窗体、窗体之间传值、打开唯一窗体】

1、打开多个窗体 2、窗体之间的传值 3打开唯一窗体 Form1中btn1按钮点击show出Form2,当Form2处于开启状态时,再次点击btn1不会继续弹出窗体,而是将焦点定位至已开启的Form2上;当Form2关闭后,再次点击btn1则会show出一个新的Form2; Form1: //创建一个全局集合,用来放置已经show出的窗体对象 L...

Winform开发常用控件之DataGridView的简单数据绑定——自动绑定

DataGridView控件可谓是Winform开发的重点控件,对于数据的呈现和操作非常方便,DataGridView可谓是既简单又复杂。简单在于其已经集成了很多方法,复杂在于可以使用其实现复杂的数据呈现和操作。 本文是入门级培训,先介绍DataGridView的简单应用,复杂的应用在后续的博文中会一一呈上。 DataGridView主要是呈现数据和数据操...

c#实现多线程代码例子

相信大家都有用过网际快车等下载资源的经历,它里面是可以设置线程数的(近年版本默认是10,曾经默认是5)。它会将文件分成与线程数相同的部分,然后每个线程下载自己的那一部分,这样下载效率就有可能提高。相信大家都有加多线程数,提升下载效率的经历。但细心的用户会发现,在带宽一定的情况下,并不是线程越多,速度越快,而是在某一点达到峰值。在C#中用多线程并不难实现。它...

网络socket编程实现并发服务器——多线程编程

一、多线程简介1、什么是线程?       线程在操作系统原理中是这样描述的:线程是进程的一条执行路径。线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,所有的线程都是在同一进程空间运行,这也意味着多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调...