代码之家  ›  专栏  ›  技术社区  ›  John

在BeginThread方法中传递指向对象的指针

  •  0
  • John  · 技术社区  · 7 年前

    Type
    Test = class
    
    end;
    
    TestIpl = class (Test)
    
    end
    

    然后我创建对象:

    obj = TestIpl.Create();
    

    BeginThread(nil, 0, @mtd, obj, 0, Threadinfo.ThreadId);
    

    在method:mtd中,我想使用created object,所以我将其转换为:

    var 
      obj: Test;
    begin
    obj :=  Test(DataParameter);
    

    我做得对吗,但更重要的是。能这样做吗? 我很担心将指针投射到其原始对象的行。这样行吗?

    目前,当我想在testIpl中使用重载方法时,我得到AV。

    编辑

    function mtd(DataParameter: Pointer): DWORD; stdcall;
    

    测试用例

    unit Unit2;
    
    interface
    
    Type
      Test = class
      protected
        function Test(): Integer; virtual;
      end;
    
      TestIpl = class (Test)
      protected
        function Test(): Integer; override;
      end;
    
    procedure TestCase;
    
    implementation
    
    function RunThread(Parameter: Pointer): Integer;
    var
      x: Test;
      Rslt: Integer;
    begin
      x := Test(Parameter);
    
      Rslt := x.Test();
    end;
    
    
    procedure TestCase;
    var
      test: TestIpl;
      ThreadId: Cardinal;
    begin
      test := TestIpl.Create;
    
      BeginThread(nil, 0, Addr(RunThread), Addr(test), 0, ThreadId);
    end;
    
    { Test }
    
    function Test.Test: Integer;
    begin
      Result := 1;
    end;
    
    { TestIpl }
    
    function TestIpl.Test: Integer;
    begin
      Result := 2;
    end;
    
    end.
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Ondrej Kelle    7 年前

    声明线程例程与 TThreadFunc (根据要求 BeginThread

    function mtd(Parameter: Pointer): Integer;
    

    或者,如果你总是通过 Test 作为它的后代,您可以简单地声明它:

    function mtd(Obj: Test): Integer;