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();方法,是这样吗?不知道是什么问题。

解决方案 »

  1.   

    to: comanche(太可怕)可在线?帮忙看一下,谢谢啦。
      

  2.   

    主线程和你新创建的线程是独立的。tThread 创建后是不能确定什么时候调用的。可能是在  result := IsOk;这句话之前也可能是在这之后。调试时执行的顺序并不是多线程在运行时一定会执行的
    顺序。而且你这 IsOk 是多个线程的公用变量,如果不同同步的方式,这个变量可以就根本就是不安全的,无法预料他返回的值。tThread := myThread.Create (); 仅是创建了线程,调度可能在这后的任何时间。
    如果想知道CreateSamSungTable的值,有两种办法:
    1 用全局变量,但是要用同步来访问,造成的后果是可能会造成界面锁定,好象是单线程的状态。
    2 用消息,CreateSamSungTable();执行完成后,将结果发送给主窗体或其它的窗体,接收者收到后在进行处理,这应是比较合理的办法。因为用多线程就是想达到异步的效果。
      

  3.   

    uses
      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.
      

  4.   

    不过我建议最好把reeOnTerminate := False放在Create里面。不然看起来怪怪的
      

  5.   

    to:sanmaotuo(老冯)我按照你的试了一下,还是不行,还是很谢谢你。
      

  6.   

    to:sanmaotuo(老冯)不好意思呀,现在行了,我少加了一行: _TThread.WaitFor;
    为什么不加这一行代码就不行了呢?
      

  7.   

    我在测试时是直接把FIsOk := True来执行的,因为你原来的代码就是这样直接赋值,在外部调用Import时总是返回False; 我再把CreateSamSungTable加上长时间代码看看。
      

  8.   

    呵呵。你看看WaitFor的说明你就很明白了,并且我是把_TThread.FreeOnTerminate := False;然后手工_TThread.Free;这都是和WAITFOR有关
      

  9.   

    我在CreateSamSungTable加了长时间代码运行没有问题的。
    ......以上代码测试通过。测试员:老冯