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

解决方案 »

  1.   

    在线程变量里添加一个变量,记录主线程的句柄。当退出while循环后,向主线程发送自定义消息。主线程响应自定义消息时释放掉DLL
      

  2.   

    用同步不好写啊,我的想法是,释放dll时,有什么方法能让线程立即从execute方法中退出。
      

  3.   

    有一个函数可以强制结束线程。好像是TerminateThread吧?你查查文档,不过不推荐使用,最好等线程执行完循环后自然退出
      

  4.   

    有个SleepEx的函数,当执行到该方法时,线程会停顿,但可以同时做一些其他的操作,可以在这上面想办法。但是就是不知道用什么好的方法退出execute.
      

  5.   

    建议等线程free后,再退出dll
    sleep(5000);
    可以分成5次,每次sleep1000,sleep前判断Terminated 状态
      

  6.   

    TerminateThread可以直接结束,但是线程所用的内存是不会被释放的。
    你也可以先停止线程然后再释放DLL
      

  7.   

    用一个互斥信号哈如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里面的线程退出后 你的主程序里面才能进行释放的操作,不然主程序将一直等待,如果你这个释放在界面线程里面,要防止冻结主界面哦希望对你有用