源代码:
EnterCriticalSection(CS);
  with AdoQry do
  begin
  end;
LeaveCriticalSection(CS);

解决方案 »

  1.   

    是不是
      with AdoQry do
      begin
      end;
    代码中有问题。把这段代码去咯,换上beep(),试试!
      

  2.   

    可能你的ado控件设置成了异步执行模式
      

  3.   

    如果你只用了一个临界区,是不可能产生死锁的.
    我注意到你在线程中用了一个TADOQuery对象,这个对象会创建并调用ADORecordset对象,这是一个COM对象,它的使用与对象的线程模式有关.并且,在"公寓线程"中创建的对象是不能在其它线程中随意使用的,要通过"列集"与"散集"的方式把它传给另一个线程.
    建议用如下方式来完成对ADOQuery访问的串行化:
    1:在你的线程对象中加一个方法:
    procedure GetQueryData;
    begin
      with AdoQry do
      begin
      end;
    end;
    2:你的代码改为:
    Synchronize(GetQueryData);
    这样,不使用临界区,也完成了串行化,而GetQueryData中的代码是在主线程中执行的,不容易出错.
    线程在休眠时(TThread.Suspend),不会执行任何语句,直到被唤醒,与循环没有关系.
    Delphi的TThread在停止时(TThread.Terminate)并没有终止线程,只是把Terminated属性设为true.而通常线程都是这样写的:
    ...
    while (not Terminate) and (...) do
    begin
    ...
    end;
    这时就会退出循环,不过循环中的语句会被完整执行.
    如果要强制终止线程,应该用:TerminateThread(MyThread.Handle);