多线程(40分)

  • 主题发起人 主题发起人 delphifaq
  • 开始时间 开始时间
D

delphifaq

Unregistered / Unconfirmed
GUEST, unregistred user!
如何不用D3的TTHREAD类,只用WIN9X API编写多线程程序,请举详细例子
包括API函数声名,多线程操作
 
请看classes.pas中的TThread类的定义,及其实现。
 
看书吧?
<Delphi 4编程技术内幕>
或者Charles Petzld的<Windows 95程序设计>
 
可以用CreateThread生成一个线程。
再声明一个线程函数形如:
DWORD WINAPI ThreadFunc( LPVOID );
在ThreadFunc中写你的线程处理就可以了。
具体可看看CreateThread的联机帮助,很空易理解。
注意ThreadFunc必须声明为全局的。
 
Marco写的 window高级开发指南 中有详细的介绍
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Hd:Thandle;
ThID:DWord;
implementation
{$R *.DFM}
function MyThread(p:Pointer):Longint;stdcall;
var
i:integer;
dc:HDC;
s:string;
begin
DC:=GetDc(Form1.handle);
for i:=1 to 10000000do
begin
s:=inttostr(i);
textout(dc,10,10,PChar(s),length(s));
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
HD:=CreateThread(nil,0,@MyThread,nil,0,ThID);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
TerminateThread(Hd,0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ResumeThread(HD);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
suspendThread(hd);
end;

end.
 
function MyThread(p:Pointer):Longint;stdcall
中忘了写ReleaseDc(form1.handle,dc);
 
Liu JZX:stdcall是干什么用的?我删掉了也运行很正常啊.
后面三个按钮分别是干什么用的? 谢了.
 
stdcall Right-to-left Routine No
除了不清空堆栈,同CDECL
因为API是用C写的,用的就是Stdcall
所以。。。
 
谢谢千中元,但是,为什么我把
function MyThread(p:Pointer):Longint;stdcall;放到
procedure Button4Click(Sender: TObject);下面之后,
HD:=CreateThread(nil,0,@MyThread,nil,0,ThID);就会出错?
 
beta,
我也刚学了一个星期的线程(说来惭愧,以前没“敢”看),共同切磋下吧。
错误信息?
 
是不是因为没有在 func里没有释放设备呢?
加上: ReleaseDC(form1.handle,DC)试下吧。
 
后天再说,今天全市联考... :-(
 
多人接受答案了。
 
后退
顶部