上一张贴子http://topic.csdn.net/u/20100525/13/d9a7487a-9ee5-4c67-826b-eb7ab7e1fe2c.html问题还没解决。
我现在在临界区里增加了判断那个线程的Suspended状态,如果它为True,表示它为挂起,我就Resume一下。
但现在发现线程明明已经挂起了,但是Suspended状态还是为False,这该怎么解决啊
我现在在临界区里增加了判断那个线程的Suspended状态,如果它为True,表示它为挂起,我就Resume一下。
但现在发现线程明明已经挂起了,但是Suspended状态还是为False,这该怎么解决啊
OldSuspend: Boolean;
begin
OldSuspend := FSuspended;
try
FSuspended := True;
{$IFDEF MSWINDOWS}
CheckThreadError(Integer(SuspendThread(FHandle)) >= 0);
{$ENDIF}
{$IFDEF LINUX}
CheckThreadError(pthread_kill(FThreadID, SIGSTOP));
{$ENDIF}
except
FSuspended := OldSuspend;
raise;
end;
end;发生这类问题的原因代码执行出错了。
加了临界区就得确认一下临界区是否加对了。还有你循环判断TList中是否有内容是放到子线程中了还是放到主线程里了?是不是你的子线程直接执行完毕了,只不过没有释放罢了
pxxxx = ^自定义结构
TxxThread = class(TThread)
private
List: TList;
ThreadList: TThreadList;
procedure addTask(p: pXXXX)
end;
procedure TxxThread.addTask(p: pXXXX)
begin
ThreadList.add(p);
end
procedure TxxThread.Execute
begin
try
while true do
begin
Sleep(1);
List := ThreadList.LockList;
if List.Count = 0 then
begin
ThreadList.UnlockList;
Continue;
end; p := List[0];
List.Delete(0);
ThreadList.UnlockList;
Dispose(p);
end;
except
end;
end;
简单的例子,看看吧