技巧:进程与线程

来源:互联网 发布:魔兽世界数据库6.2 编辑:程序博客网 时间:2024/04/30 15:50

 进程与线程


一、进程

1.1进程概述
进程(Process)是指当前所加载程序,磁盘上的可执行文件被启动后才是一个进程。进程不做任何事情,一个进程可以有多个线程至少应包含一个线程。程序中所有的操作都是由线程完成的。

1.2创建进程
进程的创建可以通过CreateProcess API函数来完成。函数声明
如下:
BOOL CreateProcess(
LPCTSTR lpApplicationName,//指向可执行文件名的指
LPTSTR lpCOmmandLine,//指向执行命令字符串的指针
LPSECURITY_ATTRIBUTES  lpProcessAttributes,//指向进程安全属性的指针
BOOL bInheritHandles,//被创建进程是否继承创建进程的句柄
DWORD dwCreationFlags,//被创建标志
LPVOID lpEnvironment,//指向新创建的环境块的指针
LPCTSTR lpCurrentDirectory,//指向当前工作目录的指针
LPSTARTUPINFO lpStartupInfo,//指向进程启动信息结构体的指针
LPPROCESS_INFORMATION lpProcessInfomation //指向进程信息结构体的指针

调用记事本用法如下:
WinExecAndWait32('notepad', True);


function WinExecAndWait32(FileName: string; Visibility: Boolean): integer;
var
  zAppName: array[0..512] of char; //存放应用程序名
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  exitCode: Dword;
  aVisibility: integer;
begin
  StrPCopy(zAppName, FileName);
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  //给StartupInfo结构体赋值
  StartupInfo.cb := Sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  if Visibility then
    aVisibility := 1
  else
    aVisibility := 0;

  StartupInfo.wShowWindow := aVisibility;
  //调用CreateProcess 创建进程,执行指定的可执行文件
  if not CreateProcess(nil, zAppName, nil, nil, false
    , CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS
    , nil, nil, StartupInfo, ProcessInfo) then
    Result := -1
  else
  begin
    //等待可执行文件退出
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
    //得到进程终止状态码
    GetExitCodeProcess(ProcessInfo.hProcess, exitCode);
    result := Exitcode;
  end;
end;

二、线程

2.1线程概述
线程是进程内部的一个执行单元(如可以是一个函数或一个活跃类对象等)。系统创建好进程后,实际上就启动执行了该进程的主执行线程。

2.2线程使用
Delphi中有一个线程类TThread是用来实现多线程编程的。

2.2.1创建
利用TThread的Create方法可以创建线程对象的实例。声明如下:
Constructor Create(CreateSuSpended:Boolean);
如果参数CreateSuSpended设为False,表示线程创建后立即执行;如果设为True,表示线程处于修眠状态,调用Resume方法后,便可执行线程的Execute方法。
FreeOnTerminate为True表示线程执行完成后自动终止线程

示例如下:
unit SortU;

interface

uses
  Classes;
type
  TSortThread = class(TThread)
  private
    FSortArray: array of integer;
  protected
    procedure Execute; override;
    procedure Sort;
  public
    constructor Create(CreateSuspended: Boolean;var SortArray: array of Integer);
  published
  end;
implementation

constructor TSortThread.Create(CreateSuspended: Boolean;var SortArray: array of Integer);
begin
  FSortArray := @SortArray;
  FreeOnTerminate := True;
  inherited Create(CreateSuspended);
end;

{当线程开始时,Execute方法将被调用。}

procedure TSortThread.Execute;
begin
  FreeOnTerminate := True;
  Sort;
end;

{下面实现了冒泡法排序}

procedure TSortThread.Sort;
var
  I, J, T: Integer;
begin
  for I := High(FSortArray) downto Low(FSortArray) do
    for J := Low(FSortArray) to High(FSortArray) - 1 do
      if FSortArray[J] > FSortArray[J + 1] then
      begin
        T := FSortArray[J];
        FSortArray[J] := FSortArray[J + 1];
        FSortArray[J + 1] := T;
        if Terminated then Exit;
      end;
end;
end.

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    SortThread: TThread; //线程实例
    aSort: array of integer; //排序数组
    procedure SortOver(sender: TObject); //当排序执行完后执行的过程
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses SortU;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
  //排序数组赋值
  setLength(aSort, 4);
  asort[0] := 13;
  aSort[1] := 9;
  aSort[2] := 15;
  aSort[3] := 12;
   //创建SortThread实例,并执行线程
  SortThread := TSortThread.Create(False, aSort);
  SortThread.OnTerminate := SortOver; //当线程终止时,调用SortOver方法显示排序后数组
end;

procedure TForm1.SortOver(Sender: TObject);
var
  i: integer;
begin
  Memo1.Lines.Clear;
  for i := 0 to 3 do
  begin
    Memo1.Lines.Add(intToStr(aSort[i]));
  end;
end;

2.2.2挂起、恢复
将线程对象的属性SuSpended设为True,此时线程处于挂志状态
将线程对象的属性SuSpended设为False或执行线程对象的Resume方法恢复线程

2.2.3终止
a、自动中止
FreeOnTerminate := True;

b、手动控制线程结束
调用线程对象的Terminate方法

2.2.4线程同步