Dll代码如下:
myThread = Class(TThread)function Import(): Boolean; stdcall;
var
tThread: myThread;
begin
tThread := myThread.Create ();
tThread.FreeOnTerminate := true;
result := IsOk;
end;constructor myThread.Create();
begin
inherited Create(false);
end;procedure myThread.Execute;
begin
IsOk := CreateSamSungTable();
end;
主程序调用Import()函数时老是返回false,其中CreateSamSungTable()此函数肯定返回的是true;
有一点不明白:调试时发现,进入Import()函数时,所有代码都执行完了后才会执行myThread.Execute();方法,是这样吗?不知道是什么问题。
myThread = Class(TThread)function Import(): Boolean; stdcall;
var
tThread: myThread;
begin
tThread := myThread.Create ();
tThread.FreeOnTerminate := true;
result := IsOk;
end;constructor myThread.Create();
begin
inherited Create(false);
end;procedure myThread.Execute;
begin
IsOk := CreateSamSungTable();
end;
主程序调用Import()函数时老是返回false,其中CreateSamSungTable()此函数肯定返回的是true;
有一点不明白:调试时发现,进入Import()函数时,所有代码都执行完了后才会执行myThread.Execute();方法,是这样吗?不知道是什么问题。
顺序。而且你这 IsOk 是多个线程的公用变量,如果不同同步的方式,这个变量可以就根本就是不安全的,无法预料他返回的值。tThread := myThread.Create (); 仅是创建了线程,调度可能在这后的任何时间。
如果想知道CreateSamSungTable的值,有两种办法:
1 用全局变量,但是要用同步来访问,造成的后果是可能会造成界面锁定,好象是单线程的状态。
2 用消息,CreateSamSungTable();执行完成后,将结果发送给主窗体或其它的窗体,接收者收到后在进行处理,这应是比较合理的办法。因为用多线程就是想达到异步的效果。
SysUtils,
Classes;type
MyThread = Class(TThread)
private
FIsOk: Boolean;
protected
procedure Execute; override;
public
constructor Create;
property IsOk: Boolean read FIsOk;
end;{$R *.res}constructor MyThread.Create();
begin
inherited Create(false);
end;procedure MyThread.Execute;
begin
FIsOk := CreateSamSungTable();
end;function Import: Boolean;
var
_TThread: MyThread;
begin
_TThread := MyThread.Create ();
_TThread.FreeOnTerminate := False;
_TThread.WaitFor;
Result := _TThread.IsOk;
_TThread.Free;
end;exports
Import;
end.
为什么不加这一行代码就不行了呢?
......以上代码测试通过。测试员:老冯