FreePascal中简易的多线程程序

要创建一个新的进程,要使用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)执行,能够引起现成转换,但是不能保证,它依靠操作系统和处理器的数量.

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

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

这是简单的程序
巫山霏云精心整理,希望大家喜欢!
谢谢…

2005年7月31日

写在18岁来临前的晚上

只有影子才会忠实的一辈子永远不离开你,可是他不会和你分担你的痛苦与欢乐,哪里去找一个如影相随的人还要能分担欢乐和痛苦? 再过几十分钟,我就过18岁生日咯

18岁,究竟意味着什么呢?法定成人咯

很辛苦的捱到这一天,很不赞同古人的所谓18年后又是一条好汉,18年,多难熬啊,少年已识愁滋味,不知道是否该…

身体不适,要吃药,却又最苦的一味黄连,我不是哑巴,所以我要说出来——苦啊…注定要这么苦我也愿意

其实我的想法很简单的,可是,做起来却没有那么简单.这便是有人为什么不幸福吧,因为现实和所想的不同

好怕的,将来会怎么变化,说句实话,我并不喜欢变化.我喜欢独自能品茗一杯茶,能够和自己所喜欢的在一起,并无其他要求.功名利禄,已经看的很轻咯所

谓幸福,就是又自己所喜欢的,做自己所喜欢的事吧,并不在乎别的什么附加

曾经想给自己起个什么字什么,可是一直没有找到一个合适的字,反正离20岁还早…慢慢来,虽然有人不喜欢我改名字…我希望能体现我的志趣

18咯,意味着身上有多了一份责任…我还要加强自身修养

18咯,并不意味着长大,所以,我依然可以不变,我还是我,尽管每天都有小小的变化,可是本质没变就好,会严格控制量变的…就怕自己变心咯

10号的组队赛,希望一切顺利…尽量保持一种好心情,会带来好处的…

十年

又一次听到十年,不得不承认MTV和MP3的感觉是不一样的,十年会给我们带来多少改变…谁又知道
十年…一年后我们又如何,一月前,一月后,世事变换真快啊…我不想去回忆那些往事,可是却总会浮现在我脑海…我明白得并不多,可是也不少,我是一个中间的什么也不是的角色,我站着,我觉得我很无奈,究竟这一切如何?我不知道,我不知道我究竟会怎样
十年,我们可以有多少变化?忘咯很多吧…

十年以后我们还要在一起,现在就要开始准备吧!

快乐拾零

不知道该用怎样的语句来确切描述快乐的样子,快乐似乎是个难以名状的东西,但我想,点滴的快乐就如细小的米兰静静地绽放在你的周围,散发着怡人的清香,沁人心脾。

平静的生活中,点滴的快乐不时闪现着,快乐可以是这样的:为了迎接考试,独自一人在自习室里看了整整一个下午的书,直到夕阳的余晖洒在了伏案的桌上。合上书本,一个人懒懒地走在校园的小路上。这时,一辆自行车轻巧地与你擦肩而过,待你抬眼看时,只看到一袭白裙飘然而过。心蓦然一动,想起了曾经的那个女孩,偷偷轻轻微笑……

不觉间,已踱到了生活区,习惯地抬头去看看宿舍楼,总能很快地从众多的灯光中辨认出属于自己的那圈白晕,心内满是温暖。暗自忖度室友们此刻是否已舒服地躺在床上,抑或是沉浸在美妙的音乐世界中,不禁加快了脚步……

假日里,在公交车上,看到两个扎着小辫,穿着花裙子的小女孩,用稚嫩的童音大声念着儿歌,尽情地玩着拍手游戏。那甜甜的童音和着清脆的击掌声,如山泉般丁冬作响,滋润着你的心田。在她们的边上,一位老人正看着她们出神,不时露出淡淡的微笑,她是否也想起了那个年代的歌谣呢?

公交车在红灯时,缓缓停下,不经意间望了窗外,哪知在另一辆车的车窗边,贴着一张小圆脸,一个胖嘟嘟的小男孩,调皮地挣脱了母亲的双手,趴在车窗边,两只小手支撑着他的小圆脸,忽闪着两只大眼睛,正定定地盯着你看。忍俊不禁。

在一家小书屋突然发现了已寻觅很久的诗集,收到一条许久不联系的老朋友的祝福短信,学校边上新开的冷饮店里,推出了你最喜欢的抹茶冰淇淋,书桌上的小盆栽结出了可爱的小番茄,天空格外的蓝……快乐悄悄在心里滋长,蔓延……

点滴的快乐如夏日的冰淇淋清凉舒爽,如夏夜里的萤火虫忽闪而过,如水里的一尾小鱼俏皮优游。

快乐无处不在,它悄悄的藏匿在我们生活的每个小角落,等待着你的心去激活它们。

呵呵,不记得转自何方咯