1.程序如下:
procedure ThreadTest(strTest : string);
begin
  RichEdit1.Lines.Add(strTest);
end;
//
//
procedure TfrmMain.Button1Click(Sender: TObject);
var
  strTest : string;
  ThreadId : DWORD;
begin
  strTest := 'This is a test';
 
  CreateThread(nil, 0, @ThreadTest, pChar(strTest), 0, ThreadId);
end;
编译没问题,但是运行的结果总是不正确,设断点,ctrl+F7看变量的变化发现,原来strTest的值是'This is a test',但是不知道为什么pChar(strTest)后,strTest :=''.是什么导致了这个问题的出现呢?还有应该怎么解决?请各位帮忙,谢谢.
//
//
//
2.
程序如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls,Unit2;type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  test : TTest;
  ThreadId : DWORD;
begin
  test := TTest.Create;  CreateThread(nil, 0, @test.ThreadTest, nil, 0, ThreadId);
end;end.
//
//-----------------------------------------------------------------------------------
//
unit Unit2;interfacetype TTest = class
  procedure ThreadTest;
end;implementationuses Unit1;{ TTest }
procedure TTest.ThreadTest;
begin
  Form1.Memo1.Lines.Add('Thread test OK.');
end;end.编译的时候出现错误:[Error] Unit1.pas(166): Variable required
                   [Fatal Error] Unit2.pas(11): Could not compile used unit 'Unit1'原因是什么?该怎么解决呢?谢谢.

解决方案 »

  1.   

    改成这个试试:
    CreateThread(nil, 0, @ThreadTest, @strTest, 0, ThreadId);最好把strTest定义成pchar
      

  2.   

    1、修改函数类型:
    procedure ThreadTest(strTest : string);
    begin
      RichEdit1.Lines.Add(strTest);
    end;
    -------------------------->>>>>>>>>>>>
    procedure ThreadTest(strTest : string);stdcall;
    begin
      RichEdit1.Lines.Add(strTest);
    end;
      

  3.   

    回调函数需要stdcall修饰,CreateThread为Windows API,
    由于C++和PASCAL编译器对参数入栈和函数返回的处理有可能不一致,把函数类型用WINAPI(WINAPI宏展开就是__stdcall)或stdcall统一修饰。
      

  4.   

    2、
    procedure TForm1.Button1Click(Sender: TObject);
    var
      test : TTest;
      ThreadId : DWORD;
    begin
      test := TTest.Create;  CreateThread(nil, 0, @test.ThreadTest, nil, 0, ThreadId);
    end;
    不需要创建一个对象的实例,直接调用类对象的静态函数。
    ---------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ThreadId : DWORD;
    begin
      CreateThread(nil, 0, @TTest.ThreadTest, nil, 0, ThreadId);
    end;unit2------------------》》》》》》》》》》》》》》》
    unit Unit2;interfacetype
     TTest = class
      procedure ThreadTest;stdcall;
    end;implementationuses Unit1;{ TTest }
    procedure TTest.ThreadTest;stdcall;
    begin
      Form1.Memo1.Lines.Add('Thread test OK.');
    end;end.