欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入浅析WinForm 进程、线程及区别介绍

程序员文章站 2023-10-23 22:07:47
一、进程 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。 它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。 process 类...

一、进程

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

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

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 进程、线程及区别介绍,希望对大家有所帮助