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

    一、进程

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

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

    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 ;
        ......
      }

  • 相关阅读:
    VC++用Recordset MSPersist载入C#DataSet Save出来的xml失败,但载入VC Recordset Save出来的xml则没问题,怎么xml不通用呢?
    观察力、分析问题的能力、与人沟通的能力和资源整合能力
    [导入]有感于神童之神源
    军训系列二:两类人创业不容易成功
    运行微软的SOAP3.0的VC样例Samples30_ADOTM_Client报错,m_pSoapClient>Invoke时直接失败
    About IM software
    [导入][转]好企业是什么样?
    动网论坛v7.0.0SQL版竟然帯病毒!
    CZoneSoft出品: 音频视频在线录制系列之 AV留言本 简介
    递归算法在生成树型结构中,几乎完全属于无稽的算法
  • 原文地址:https://www.cnblogs.com/ShenG1/p/5839618.html
Copyright © 2011-2022 走看看