关于线程和内存释放问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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; //请问这里跟上一句有什么区别?你写成这样,系统最终还是会写回上面一句