线程是什么东西!请教!(7分)

  • 主题发起人 主题发起人 fanronghua
  • 开始时间 开始时间
F

fanronghua

Unregistered / Unconfirmed
GUEST, unregistred user!
线程是什么东西!请教!
我不知道线程是什么东西!怎么建立,有什么用,怎么用!有什么好处!赐教!
 
一个程序好比一个房子,且多为单个房(此人来完成房里的所有工作,他只能一件一件的完成),此人的工作过程便是一个主线程
如果有多个人在一人房子里,它们共同完成房里的所有工作,每人的工作过程便是一个子线程
 
我想知道它怎么建立的,撤消,有什么用,Jiams,能不能给个例子啊?
 
调入内存准备执行的应用程序称进程。线程是进程中的一个执行单元。
要例子,Delphi自己带的有呀!
 
啊啦,你不是学计算机出身的吧。
先看看一些操作系统的书吧。[:)]
 
Windows API 调用Createthread函数来创建一个线程.
函数如下.
handle createthread(lpsecurity_attributes lpthreadattributes,
dword dwstacksize,
lpthread_start_routine lpstartaddress,
lpvoid lpparameter,
dword dwcreationflags,
lpdword lpthreadid
);
第一个参数是安全属性,一般设为NIL.
第二个参数是线程堆zan尺寸,,一般设为0,
第三个最重要,是一个指向函数名的指针,但在传递时很简单,只要在函数名前加上@就可以了
第四个参数是你要向线程传递的参数,一般是一个指向结构的指针,不需要传递参数时,此参数就设为nil.
第五个参数一般也设为0
第六个参数是系统分配给这个线程的唯一的ID标志.
例:
function procfun...
.......省略..
var
hthread:thandle;
threadid:dword;
begin
hthread:=createthread(nil,0,@procfun,nil,0,threadid);
end;

上面是一个比较简单的例子,如果E文好的话,可以直接去查MSDN,里面有详细说明.
如果还有什么不明白的话,也可以加我QQ:22365490
我打字不是很快,今天也打累了.有空聊.
关于线程的问题,你可以去看看有关操作系统的书.比较有趣的.
 
JIAMS的比喻是比较形象的。
真正的冯.诺依曼体系的计算机结构中,CPU在一个时刻只能对单一任务进行处理。但在WIN95及以上版本的OS时常用到多任务分时处理。
多线程把单一的进程划分为多个不同的部分,每个部分被称为线程,每个线程都由CPU分时处理。
我提供个书上的例子作为参考:(你比较一下线程和非线程情况就会有感性认识了)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ToolWin, ComCtrls;
const
ccolcount=20;
crowcount=20;
cheight=20;
cwidth=25;
type
TForm1 = class(TForm)
ToolBar1: TToolBar;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
function threaddraw(p:pointer):longint;stdcall;
function threadcount(p:pointer):longint;stdcall;
procedure pointswap(var npointa,npointb:tpoint);
implementation
{$R *.DFM}
procedure pointswap(var npointa,npointb:tpoint);
var
temp:tpoint;
begin
temp.x:=npointa.x;
temp.y:=npointa.y;
npointa.x:=npointb.x;
npointa.y:=npointb.y;
npointb.x:=temp.x;
npointb.y:=temp.y;
end;

function threaddraw(p:pointer):longint;stdcall;
var
a:array [1..ccolcount*crowcount] of tpoint;
i,j,k:integer;
begin
k:=0;
for i:=1 to ccolcountdo
for j:=1 to crowcountdo
begin
inc(k);
a[k].x:=i;
a[k].y:=j;
end;

for i:=1 to ccolcount*crowcountdo
pointswap(a,a[succ(random(ccolcount*crowcount))]);
form1.canvas.brush.color:=form1.color;
form1.canvas.fillrect(rect(0,0,ccolcount*cwidth,crowcount*cheight));
for i:=1 to ccolcount*crowcountdo
begin
form1.canvas.brush.color:=random($FFFFFF);
j:=pred(a.x)*cwidth;
k:=pred(a.y)*cheight;
sleep(20);
form1.canvas.fillrect(rect(j,k,j+cwidth,k+cheight));
end;

end;

function threadcount(p:pointer):longint;stdcall;
var
i:integer;
dc:hdc;
s:string;
begin
dc:=getdc(form1.handle);
for i:=0 to 1000000do
begin
s:=inttostr(i);
textout(dc,200,200,PCHAR(S),Length(s));
end;
releasedc(form1.handle,dc);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
threaddraw(nil);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
hthread:thandle;
threadid:dword;
begin
hthread:=createthread(nil,0,@threadcount,nil,0,threadid);
if hthread=0 then
messagebox(handle,'线程建立失败!',nil,MB_OK);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
hthread:thandle;
threadid:dword;
begin
hthread:=createthread(nil,0,@threaddraw,nil,0,threadid);
if hthread=0 then
messagebox(handle,'线程建立失败!',nil,MB_OK);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
threadcount(nil);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
close;
end;

end.
 
一人(单线)做卫生快还是多个人(多线)一起作的快。
在多个作卫生时,扫把够不够,扫过的地方是不是被重扫了,也就是多线程时你要注意同步和互斥。
 
后退
顶部