WinForm进程 线程

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

一、进程:

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。
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();
            }

    
  }

时间: 2024-10-12 19:44:35

WinForm进程 线程的相关文章

WinForm 进程 ,线程

进程:一个进程,代表一个程序 线程:一个程序,有多个线程. 为什么要使用多线程操作:一个窗体,在创建的时候,默认会生成一个主线程,这个主线程会操作窗体的移动等操作,在执行需要等待时间的方法时,如果没有多线程操作,窗体是无法进行移动的,并且关闭之后,方法还会继续运行,会引起程序故障.因此使用多线程操作.[不能让主线程进行需要等待时间的操作] using System; using System.Collections.Generic; using System.ComponentModel; us

Winform进程、线程

进程: 一般来说,一个程序就是一个进程,不过也有一个程序需要多个进程支持的情况. 进程要使用的类是:Process它在命名空间:System.Diagnostics; 1.静态方法Start(); 2.也可以实例化对象,来调用Start()普通方法,但调用普通方法之前需要给 StartInfo属性设置一个对象,来通知它要打开的是哪个进程(绝对路径) private void button1_Click(object sender, EventArgs e) { Process.Start("ch

Linux下进程线程,Nignx与php-fpm的进程线程方式

1.进程与线程区别 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源. "进程——资源分配的最小单位,线程——程序执行的最小单位" 进程有独立的地

android 进程/线程管理(四)续----消息机制的思考(自定义消息机制)

继续分析handler 和looper 先看看handler的 public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } } 所以消息的处理分层三种,就是 1.传入一

进程/线程介绍

一.进程 进程可以认为是程序执行时的一个实例.进程是系统进行资源分配的独立的实体,且每个进程拥有独立 的地址空间.一个进程无法直接访问另一个进程的变量和数据结构,如果希望让一个进程访问另一个进程 的资源,需要使用进程间通信,比如:管道,有名管道,信号,信号量,消息队列,套接字等. 一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间.线程和进程的一个主要区别是,同一程序内 的多个线程会共享部分状态,多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存).同时 每个线程还拥有自己的寄

进程线程协程那些事儿

一.进程与线程 1.进程 我们电脑的应用程序,都是进程,假设我们用的电脑是单核的,cpu同时只能执行一个进程.当程序出于I/O阻塞的时候,CPU如果和程序一起等待,那就太浪费了,cpu会去执行其他的程序,此时就涉及到切换,切换前要保存上一个程序运行的状态,才能恢复,所以就需要有个东西来记录这个东西,就可以引出进程的概念了. 进程就是一个程序在一个数据集上的一次动态执行过程.进程由程序,数据集,进程控制块三部分组成.程序用来描述进程哪些功能以及如何完成:数据集是程序执行过程中所使用的资源:进程控制

9 异常处理 操作系统 进程线程 队列+生产消费者模型 进程同步 回调函数

异常处理 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常的种类: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块或包:基本上是路径问题或名称错误 IndentationError 语法错误(的子类) :代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访

编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面的限制并不是很严格,所以像下面这样的代码,在WinForm中大部分情况下还能运行(本建议后面会详细解释为什么会出现这种现象): private void buttonStartAsync_Click(object sender, EventArgs e) { Task t = new Task(()

操作系统:进程/线程同步的方式和机制,进程间通信

一.进程/线程间同步机制. 临界区.互斥区.事件.信号量四种方式临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event)的区别1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问.在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占.2.互斥量:采用互斥对象机