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'原因是什么?该怎么解决呢?谢谢.
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'原因是什么?该怎么解决呢?谢谢.
CreateThread(nil, 0, @ThreadTest, @strTest, 0, ThreadId);最好把strTest定义成pchar
procedure ThreadTest(strTest : string);
begin
RichEdit1.Lines.Add(strTest);
end;
-------------------------->>>>>>>>>>>>
procedure ThreadTest(strTest : string);stdcall;
begin
RichEdit1.Lines.Add(strTest);
end;
由于C++和PASCAL编译器对参数入栈和函数返回的处理有可能不一致,把函数类型用WINAPI(WINAPI宏展开就是__stdcall)或stdcall统一修饰。
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.