zoukankan      html  css  js  c++  java
  • 进程 线程

    1.进程

    最简单的用法
    Process.Start("calc"); 里面放的是字符串
    Process需要解析

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

    实例化进程类:Process p = new Process();

    创建进程开启路径对象
    ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text);
    进程类开启路径指向
    p.StartInfo = psi;
    启动进程,不是立刻开启,什么时候开启时由CPU决定
    p.Start();

    namespace 进程
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                openFileDialog1.Filter = "应用程序|*.exe";
                DialogResult dr= openFileDialog1.ShowDialog();
                if (dr == DialogResult.OK)
                {
                    textBox1.Text = openFileDialog1.FileName;
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (textBox1.Text == "")
                {
                    MessageBox.Show("请先选择要打开的程序");
                }
                else
                {
                    try
                    {
                        //实例化进程类
                        Process p = new Process();
                        //创建进程开启路径对象
                        ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text);
                        //进程类开启路径指向
                        p.StartInfo = psi;
                        //启动进程,不是立刻开启 什么时候开启 由CPU决定
                        p.Start();
                    }
                    catch { MessageBox.Show("未找到程序,请确认路径是否正确"); }
                }
            }
        }
    }

    2.线程

    把进程想象成公司 公司只有一个老板,老板就是主线程,员工就是线程 ,

    如果所有的事情都让老板干 会干不过来,所以 相当于 程序崩溃。

    再找一些员工 就不会耽误主线程。

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

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

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

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

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

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

    关闭监控就可以了
    怎么关?
    在构造函数中,实例化方法下面加上这句话:
    Control.CheckForIllegalCrossThreadCalls = false;

    问题二:

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

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

    namespace 线程
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Control.CheckForIllegalCrossThreadCalls = false;//关闭监控,跨线程
            }
    
            List<Thread> tlist = new List<Thread>();
            private void button1_Click(object sender, EventArgs e)
            {
                string[] nums = new string[] { "13864464479", "1386445421", "13864412345", "13864453421", "13864478965", "18615151671" };
                Thread th = new Thread(aaa);
                th.IsBackground = true;//设置为后台线程
                th.Start(nums);//开启线程
    
                tlist.Add(th);
                button1.Enabled = false;
                button2.Enabled = true;
            }
    
            private void aaa(object nums)
            {
                while (true)
                {
                    string[] n = (string[])nums;
                    Random r = new Random();
                    //非负随机数 返回int类型
                    int ind = r.Next(0, n.Length);
                    label2.Text = n[ind];
                    Thread.Sleep(50);//停顿毫秒
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                foreach (Thread t in tlist)
                {
                    t.Abort();//终止线程
                }
                label2.Text = "18615151671";
                //变回来
                button1.Enabled = true;
                button2.Enabled = false;
            }
        }
    }


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

    3、总结:
    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();

  • 相关阅读:
    博客推荐
    2018
    2018
    学习推荐-Postgresql学习手册
    学习推荐-Redis学习手册
    odoo开发笔记 -- odoo源码解析
    前沿技术相关
    odoo开发笔记-tree列表视图拖拽排序
    odoo开发笔记-日期时间相关操作
    odoo开发笔记 -- 官方模块一览表
  • 原文地址:https://www.cnblogs.com/power8023/p/5914939.html
Copyright © 2011-2022 走看看