关于线程安全退出的问题。(100分)

  • 主题发起人 主题发起人 流动的情感
  • 开始时间 开始时间

流动的情感

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个dll 会hook到所有的程序里面
并且会用CreateThread创建几个线程
线程里面是用
while truedo
begin
(调用了一些公共变量)
...
sleep(1000);
end
请问在dll卸载的时候 如何安全退出该线程
 
设置个全局变量,在线程的execute里的循环中判断,条件成立则退出,你的代码是死循环了
 
应该可以在DLL_PROCESS_DETACH 中处理它们.
 
我在 DLL_PROCESS_DETACH 中处理了。
case DLL_PROCESS_ATTACH :
begin
hMutex := OpenMutex($1F0001, false, PChar(sDllName + '_Mutex'));
if hMutex = 0 then
begin
hMutex := CreateMutex(nil, false, PChar(sDllName +'_Mutex'));
hookID := SetWindowsHookEx(3, @LoadLibrary, HInstance, 0);
end;

nID := CreateThread(nil, 0, @ThreadProc, nil, 0, ThreadID);
end;
case DLL_PROCESS_DETACH:
begin
if nID <> 0 then
begin
FQuit := True;
WaitForSingleObject(nID, INFINITE);
end;
if hMutex <> 0 then
CloseHandle(hMutex);
end;

function ThreadProc(Info: Pointer): Integer;
stdcall;
begin
Result := 0;
while not FQuitdo
begin
......
sleep(1000);
end;
end;

只有在自己的程序里有用。
在被hook的程序里好像没有用 进入无限等待 不知道是怎么回事
 
DLL_PROCESS_DETACH,这种东西对delphi dll来说你没有用的,你得不到出来他们的机会,已经被delphi接管了!
用SetWindowsHookEx只能hook进有消息循环的程序中!所以可以在要结束前!poss a message
给所以的进程,通知一下,再unSetWindowsHookEx!
 
好像delphi里 执行到 DLL_PROCESS_DETACH时
线程是停止状态
所以线程不可能结束
WaitForSingleObject 永远停止在那了
 
唉 没办法。只有 TerminateThread了[:(]
 
后退
顶部