首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi写的动态链接库,如何使用多线程

2013-07-08 
delphi写的动态链接库,怎么使用多线程?本帖最后由 lk13962517093 于 2013-06-07 16:02:19 编辑下面代码是

delphi写的动态链接库,怎么使用多线程?
本帖最后由 lk13962517093 于 2013-06-07 16:02:19 编辑 下面代码是从网上摘的,在应用程序中执行没有问题,但是使用动态链接库,MyThreadFun方法中的form3为nil,这是为什么呢?求指点。
(代码来源:http://www.cnblogs.com/gzcszzx/articles/2110675.html)

unit Unit3;
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls; 
 
type 
  TForm3 = class(TForm)
    Button1: TButton;
    Button2: TButton;

    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    private 
      procedure FormProc; {准备给线程使用的方法}
  end; 
 
var 
  Form3: TForm3;
 
implementation
 
{$R *.dfm} 
 
var
  hThread: THandle;

{线程入口函数}
function MyThreadFun(p: Pointer): DWORD;
begin
  Form3.FormProc; {调用 TForm1 类的方法}
  Result := 99;   {这个返回值将成为线程的退出代码, 99 是我随意给的数字} 
end; 

{TForm1 的方法, 本例中是给线程的入口函数调用的} 
procedure TForm3.FormProc;
var
  i: Integer; 
begin
  for i := 0 to 200000 do
  begin 
    with Form3.Canvas do begin
      Lock; 
      TextOut(10, 10, IntToStr(i)); 
      Unlock; 
    end; 
  end; 
end; 
 
{建立并执行线程} 
procedure TForm3.Button1Click(Sender: TObject);
var 
  ID: DWORD; 
begin 
  hThread := CreateThread(nil, 0, @MyThreadFun, nil, 0, ID);
end;

{获取线程的退出代码, 并判断线程是否退出}
procedure TForm3.Button2Click(Sender: TObject);
var
  ExitCode: DWORD; 
begin 
  GetExitCodeThread(hThread, ExitCode); 
 
  if hThread = 0 then 
  begin 
    Text := '线程还未启动'; 
    Exit; 
  end; 
 
  if ExitCode = STILL_ACTIVE then 
    Text := Format('线程退出代码是: %d, 表示线程还未退出', [ExitCode]) 
  else 
    Text := Format('线程已退出, 退出代码是: %d', [ExitCode]);
end; 
 
end.

多线程 Delphi 动态链接库
[解决办法]
但是使用动态链接库,MyThreadFun方法中的form3为nil!
就是没有 form3 := TForm3.Create(nil); 



还有在线程里面你还是Synchronize(Form3.FormProc); 这样为好!
[解决办法]
hThread := CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); 
使用这个创建函数! 你愿写成这样:
IsMultiThread := TRUE; //加上这句以免出现不必要的麻烦
hThread := CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); 

热点排行