首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于线程和内存释放有关问题!

2012-03-11 
关于线程和内存释放问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!vars:int

关于线程和内存释放问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
var
  s:integer; //全局变量
type //定义一个加法的type
  TAdd=record
  x:integer;
  y:Pinteger;
end;
PTAdd=^TAdd;



//我不想用Function,因为我程序需要把他定义成一过程
Procedure TAdd(Tem:PTAdd); stdcall; //线程的回调函数  
begin
  s := Tem^.x + Tem^.y; 
  //s := Tem.x + Tem.y; //请问这里跟上一句有什么区别?
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  Tem:PTAdd; //我的type
  XCID: DWORD;
  XCJuBing:Thandle;
begin
  New(Tem); //申请内存
  Tem.x := 10; //我的type的参数
  Tem.y := 20;
  XCJuBing := CreateThread(nil,0,@TAdd,Tem,0,XCID);//创建线程
  if XCJuBing<>0 then closehandle(XCJuBing); //这里我有必要关闭线程句柄吗?反正线程结束后就释放了,在我的程序需要不停的创建线程,因为我用线程做了延迟函数,在线程里sleep,我不喜欢网上的那些搞个循环搞个Application.ProcessMessages;什么的,我喜欢再线程里延迟
  Dispose(Tem); //这个问题很重要,请问Tem需要释放吗?要释放的话在哪里释放?我在这里释放会出错
end;



就3个小问题,其中第3个问题内存释放,需要释放吗?

[解决办法]
TAdd类型和函数名称不要一样,换个名字

第一个,没啥区别,除了用with要加“^”,其它地方一样
第二个,要
第三个,要,出错应该是相同的record类型和函数名的问题。
[解决办法]
第一个没区别
第二个最好释放
第三个,如果mem你不再需要,就要dispose,你释放出错,可能是mem被破坏,因为不知道你线程中是否对mem做了修改
[解决办法]
XCJuBing := CreateThread(nil, 0, @TAddHDHS, Tem, 0, XCID);//创建线程
WaitForSingleObject(XCJuBing, INFINITE);
if XCJuBing<>0 then closehandle(XCJuBing);
[解决办法]
释放报错,可能是线程没运行完就释放了。

WaitForSingleObject(XCJuBing, INFINITE);//等待线程完成,之后再释放,我这没问题。
[解决办法]
我奇怪楼主的加法运算,释放时还出错Dispose(Tem);
有了这个动作WaitForSingleObject(XCJuBing, INFINITE);保证线程处理完

楼主你4楼的代码我用XE测试了,可以释放,要是加了WaitForSingleObject,就更安全了

[解决办法]
s := Tem^.x + Tem^.y;
//s := Tem.x + Tem.y; //请问这里跟上一句有什么区别?你写成这样,系统最终还是会写回上面一句

热点排行