读书人

CreateThread中参数的有关问题

发布时间: 2012-02-29 16:44:10 作者: rapoo

CreateThread中参数的问题
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、ThreadFunc应该为全局或者是类的静态函数。
2、如果要传递参数那么 threadfunc应该是stdcall方式调用
procedure threadfunc(lp: PChar); stdcall;

[解决办法]
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); 的前面去

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

读书人网 >.NET

热点推荐