• 进程和线程


    一、进程:
    //进程用到的类Process,需要进行解析 using System.Diagnostics

    Process.Start("calc");//Process是非静态方法,括号里面是要开启的进程的名字

    (静态方法与非静态方法区别:静态方法不用实例化对象,直接可以点出里面的方法)

    弊端:有许多程序不知道它的运行名字到底是什么,如果写错了,就会出现程序崩溃错误

    //选择程序
            private void button1_Click(object sender, EventArgs e)
            {
                //进程用到的类Process,需要进行解析  using System.Diagnostics
                //最简单基本的方法
                //Process.Start("calc"); //Process是非静态方法,直接点出里面的方法,括号里面是要开启的进程的名字
                //Process.Start("notepad");//打开记事本
                //Process.Start("QQ");//打不开,有许多程序不知道它的运行名字到底是什么,如果写错了,就会出现程序崩溃错误
            
    
                //选择程序,用到对话框控件中的 openFileDialog
                openFileDialog1.Filter = "应用程序|*.exe";//设置一下,选择文件时只显示exe的文件
                DialogResult dr = openFileDialog1.ShowDialog();
                if (dr == DialogResult.OK)//如果点击确定
                {
                    textBox1.Text = openFileDialog1.FileName;//打开文件名
                }        
            }
    //打开程序
            private void button2_Click(object sender, EventArgs e)
            {
                if (textBox1.Text != "")//选择程序
                {
                    try//防止程序崩溃try一下
                    {
                        //实例化进程类
                        Process p = new Process();
                        //创建进程开启路径对象,实例化
                        ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text);
                        //进程类开启路径指向,设置一个属性,指定进程类要开启的是哪个进程
                        p.StartInfo = psi;
                        //启动进程,不是立刻开启,什么时候开启是由CPU决定,排队开启
                        p.Start();
                    }
                    catch
                    {
                        MessageBox.Show("未找到指定程序,请确认程序路径!");
                    }
                }
                else//还没有选择程序
                {
                    MessageBox.Show("请先选择要打开的程序!");
                }
            }


    二、线程:

    进程理解成为一个公司,公司默认有一个老板

    老板就理解成为主线程

    线程理解成为员工,公司里有好多事,不能都让老板来干,干不过来

    员工去做一件事,不会耽误老板的正常工作

    程序为什么会假死?因为主线程被占用了

    线程去执行一段需要时间的代码,主线程不会被占用,程序就不会出现假死状态了

    //创建线程类,并使用委托,指定这个线程要执行的是哪个函数
    Thread th = new Thread(aaa);
    //开启线程执行功能,也不是立刻执行
    th.Start();

    (1)问题一:
                     线程可以开启很多个,如果用户可以无限点击按钮,那么有可能会造成电脑CPU使用率过高

                     用线程执行方法,只能传一个参数,并且此参数必须是object类型

                     程序默认不允许跨线程访问对象

           办法:关闭监控就可以了

                    怎么关?

                              在构造函数中,实例化方法下面加上这句话:

                              Control.CheckForIllegalCrossThreadCalls = false;

    (2)问题二:

                     默认主窗体已经关闭,但是线程如果还未执行完工作内容,那么会默默的继续执行,直到执行完毕后才会将整个进程关闭

                     程序默认所有的线程都为:前台线程

             办法:将新开的线程变为后台线程
                      th.IsBackground = true;

    三、总结:
    (1)线程所在的命名空间:System.Threading;

    (2)线程类:Thread th = new Thread(方法名);

                      //没有不要参数的构造函数,常用的为,1个参数,参数类型是委托类型,需要一个方法指向

    (3)变为后台线程:th.IsBackground = true;

    (4)线程启动:th.Start();

                       如果要执行带参数的方法,那么这个方法的参数必须是object类型,参数传递的位置在Start方法的括号中

    (5)允许跨线程访问对象

                       在构造函数的构造方法下面加上:

                       Control.CheckForIllegalCrossThreadCalls = false;

    (6)停止线程:th.Abort();

  • 相关阅读:
    idea新建web项目
    wampserver的MySQL和本机MySQL冲突导致空密码登录报错
    while-else if
    格式化输出
    Zookeeper
    仿真手写Spring核心原理v1.0
    各设计模式总结与对比
    装饰者模式和观察者模式
    模板模式和适配器模式
    委派模式和策略模式
  • 原文地址:https://www.cnblogs.com/juyangchao12/p/5914617.html
Copyright © 2020-2023  润新知