上一张贴子http://topic.csdn.net/u/20100525/13/d9a7487a-9ee5-4c67-826b-eb7ab7e1fe2c.html问题还没解决。
我现在在临界区里增加了判断那个线程的Suspended状态,如果它为True,表示它为挂起,我就Resume一下。
但现在发现线程明明已经挂起了,但是Suspended状态还是为False,这该怎么解决啊

解决方案 »

  1.   

    判断那个Suspended状态好像不是很准确的,你需要唤醒的时候不用判断,直接resume即可
      

  2.   

    看了一下TThread的代码:var
      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;发生这类问题的原因代码执行出错了。
      

  3.   

    直接resume是不行的。唤醒不了的
      

  4.   

    你的线程是不是死锁了,你的主线程和子线程都要操作TList,主线程执行add时会把子线程的delete操作阻塞掉吧。你可以输出信息看看子线程是在什么时候被挂起的。
      

  5.   

    用console模式,线程执行过程中在命令行里写信息。。
      

  6.   

    不会用console模式。而且我在操作TList的时候都加了临界区了啊
      

  7.   

    不会用console模式,就直接写文件呗。。
    加了临界区就得确认一下临界区是否加对了。还有你循环判断TList中是否有内容是放到子线程中了还是放到主线程里了?是不是你的子线程直接执行完毕了,只不过没有释放罢了
      

  8.   

    看线程状态最好的工具还是ProceXP,如果线程堆栈停在某个带Lock的函数上,肯定就是锁住了。
      

  9.   

    关注,碰到同样问题,不知道是程序问题还是DEPHI的问题,等高手解决问题
      

  10.   

    执行了几次Suspend就需要相应的执行几次Resume才能使线程恢复,跟这个有关系没?
      

  11.   

    TList是非线程安全的类,你若果在线程操作Tlist ,要用TThreadList类该类
      
      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;    
    简单的例子,看看吧
      

  12.   

    你用AddTask增加需处理的数据就可以了,很安全
      

  13.   

    对,检查以下在操作TList的时候是否做了线程安全的控制。