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

释放含有线程的dll时,出现的有关问题

2012-03-02 
释放含有线程的dll时,出现的问题?假设有个线程在dll里创建。线程的execute方法如下:while11dobeginifTermi

释放含有线程的dll时,出现的问题?
假设有个线程在dll里创建。
线程的execute方法如下:
while   1=1   do
begin
    if   Terminated   then
        break;
    sleep(5000);
end;
在这里可能会出现一个问题。
当线程执行sleep(5000)时,那么线城会在execute方法中停留5秒,而在这5秒内,我把dll释放了。5秒后线程退出execute方法,但是这时候已经找不到该方法了,所以会出问题,应该用什么办法解决啊。

[解决办法]
用同步区,或同步方法
[解决办法]
建议等线程free后,再退出dll
sleep(5000);
可以分成5次,每次sleep1000,sleep前判断Terminated 状态
[解决办法]
TerminateThread可以直接结束,但是线程所用的内存是不会被释放的。
你也可以先停止线程然后再释放DLL

[解决办法]
用一个互斥信号哈



HMapMutex := CreateMutex(nil, false, "Your Name "); //or 已经存在了 就openmutex

if WaitForSingleObject(HMapMutex, INFINITE) = WAIT_OBJECT_0 then begin
begin
while 1=1 do
begin
if Terminated then
break;
sleep(5000);
end;
end;
ReleaseMutex(HMapMutex);


最后退出了后才释放这个互斥信号

在你的主程序里面

你要释放这个 dll 时,要等到它的释放


FreeLibrary(Hinst);
前面加上一个
HMapMutex := openmutex(MUTEX_ALL_ACCESS, False, "Your Name ");

if WaitForSingleObject(HMapMutex, INFINITE) = WAIT_OBJECT_0 then begin
begin
FreeLibrary(Hinst);

end;
ReleaseMutex(HMapMutex);

就可以实现了 只有当你的dll里面的线程退出后 你的主程序里面才能进行释放的操作,不然主程序将一直等待,如果你这个释放在界面线程里面,要防止冻结主界面哦

希望对你有用

热点排行