进程与线程
一、进程
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线程同步