procedure TFrameDataManagerResult.RzCmbWellNumberChange(Sender: TObject);
var
  TableName: string;
  strInfo:string;
  ThreadId:DWord;
  PParameter:PChar;
begin
  TableName := RzCmbWellNumber.Text;
  strInfo:='正在画图中,请稍候....';
  //SendMessage(Application.MainForm.Handle,ShowStatusPanel,1,Integer(@strInfo[1]));
  //DrawJinShengJieGou(TableName);
  //PParameter:=@TableName[1];
  GetMem(PParameter,Length(TableName)+1);
  StrCopy(PParameter,@TableName[1]);
  //ShowMessage(String(PParameter));
  ThreadHandle:=CreateThread(nil,0,@TFrameDataManagerResult.ThreadFunc,PParameter,0,ThreadId);
  if ThreadHandle<> 0 then CloseHandle(ThreadHandle);  end;procedure TFrameDataManagerResult.ThreadFunc(PParameter:PChar);
var
  F:TextFile;
begin
  AssignFile(F,'test1.txt');
  Rewrite(F);
  Writeln(F,PChar(PParameter));
  CloseFile(F);
  //MessageBox(Application.Handle,PParameter,'ddd',MB_OK);
end;在传递那个PParameter时总是不对
到了ThreadFunc就是乱码
不知道到底该如何写
请各位高人帮忙啊

解决方案 »

  1.   

    有两个问题
    1、ThreadFunc应该为全局或者是类的静态函数。
    2、如果要传递参数那么 threadfunc应该是stdcall方式调用
      procedure threadfunc(lp: PChar); stdcall;
      

  2.   

    procedure ThreadFunc(PParameter:PChar); stdcall ;
    var
    F:TextFile;
    begin
    AssignFile(F,'test1.txt');
    Rewrite(F);
    Writeln(F,PChar(PParameter));
    CloseFile(F);
    //MessageBox(Application.Handle,PParameter,'ddd',MB_OK);
    end;
    上面的函数放到
    procedure TFrameDataManagerResult.RzCmbWellNumberChange(Sender: TObject); 的前面去
      

  3.   

    这是以前遇到过的问题,如果不是直接调用API就可以用VCL的线程类继承Create创建事件,
    如果是用API就得用指针,还得加上stdcall;而且记得指针指向的数据不能是局部的至少在线程运行的前面而且保证没被释放
      

  4.   

    procedure TFrameDataManagerResult.RzCmbWellNumberChange(Sender: TObject);
    var
      TableName: string;
      strInfo:string;
      ThreadId:DWord;
      PParameter:PChar;
    begin
      TableName := RzCmbWellNumber.Text;
      strInfo:='正在画图中,请稍候....';
      //SendMessage(Application.MainForm.Handle,ShowStatusPanel,1,Integer(@strInfo[1]));
      //DrawJinShengJieGou(TableName);
      //PParameter:=@TableName[1];
      GetMem(PParameter,Length(TableName)+1);
      StrCopy(PParameter,@TableName[1]);
      //ShowMessage(String(PParameter));
      ThreadHandle:=CreateThread(nil,0,@ThreadFunc,PParameter,0,ThreadId);
      if ThreadHandle<> 0 then
        CloseHandle(ThreadHandle)
      else
        FreeMem(PParameter);
    end;procedure ThreadFunc(PParameter:PChar);stdcall;
    var
      F:TextFile;
    begin
      if Not Assigned(PParameter) then
        ExitThread(0);
      AssignFile(F,'test1.txt');
      Rewrite(F);
      Writeln(F,PParameter);
      CloseFile(F);
      FreeMem(PParameter);
      //MessageBox(Application.Handle,PParameter,'ddd',MB_OK);
    end;