free pascal 多线程

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

要创建一个新的进程,要使用BeginThread函数.它有一个强制的参数:

这个函数将执行新的线程.返回的结果是线程退出的结果.

这个现成能够被一个用来访问初始化数据的指针所传递,

程序员必须确定线程可访问的数据在访问之前没有超出范围.

函数定义:

THandle=Word;

TThreadFunc = function(parameter : pointer) : longint;

function BeginThread(ThreadFunction: tthreadfunc) : DWord;

function BeginThread(ThreadFunction: tthreadfunc; p: pointer): DWord;

function BeginThread(ThreadFunction:tthreadfunc;p: pointer;var ThreadId:THandle) :DWord;

如果给了,指针p将被传递给线程当线程开始时(否则,将传递Nil).

如果给了ThreadID, 那么这个线程的ID将被存储起来.

重新开始的线程直到线程函数退出或者被EndThread结束:

procedure EndThread(ExitCode : DWord);

procedure EndThread;

exitcode能和线程开始的代码进行检查.

下面的小例子将告诉你怎么使用:

{$Mode ObjFPc}

{$Threading On}

Uses

sysutils {$ifdef unix},cthreads{$endif} ;

Const

threadcount = 100;

stringlen = 10000;

Var

Finished:Longint;

Threadvar

thri:Longint;

Function f(p : pointer):Longint;

Var

s:Ansistring;

Begin

Writeln('thread ',longint(p),' started');

thri:=0;

While (thri

Begin

s:=s+'1';

inc(thri);

End;

Writeln('thread ',longint(p),' finished');

InterLockedIncrement(finished);

f:=0;

End;

Var

i:Longint;

Begin

finished:=0;

For i:=1 To threadcount Do BeginThread(@f,pointer(i));

While finished

Writeln(finished);

End.

InterLockedIncrement是一个在线程中安全的使用的Inc函数版本. InterLockedDecrement正好相反.

为了防止系统不约束的支持多线程程序,一些有效的函数用来操作线程.使用这些函数必须得到线程启动时的ID,因为大多数的函数需要ID来确定它们该对哪个线程起作用:

function SuspendThread(threadHandle: dword): dword;

function ResumeThread(threadHandle: dword): dword;

function KillThread(threadHandle: dword): dword;

function WaitForThreadTerminate(threadHandle: dword;TimeoutMs : longint): dword; function ThreadSeTPriority(threadHandle: dword;Prio: longint): boolean;

function ThreadGeTPriority(threadHandle: dword): Integer;

function GetCurrentThreadId: dword;

procedure ThreadSwitch;

prio=-15..15

这些函数的作用必须清楚:

SuspendThread

吊起一个线程,暂停线程的执行.

ResumeThread

重新执行一个暂停的线程

KillThread

停止一个线程,将该线程从内存中清除.

WaitForThreadTerminate

等待一个线程结束.这个函数返回当线程中止执行执或者超过了期限. ThreadSeTPriority

设置当前线程的优先级,这个调用不是一定有效.

ThreadGeTPriority

返回当前线程的优先级.

GetCurrentThreadId

返回当前线程的ID.

ThreadSwitch

允许其他线程在这个点(at this point)执行,能够引起现成转换,但是不能保证,它依靠操作系统和处理器的数量.

写多线程程序必须注意主线程和分线程之间结束先后关系,若分线程没有结束就退出程序,那么会怎样自己想

在使用线程上,我们还有更好的一个线程的类可以使用,可以管理各个线程,这里我就不介绍太多咯。我自己知道有限^_*!

相关文档
最新文档