我的程序,接收客户端的请求,然后开线程去处理,处理过程中遇到数据库操作,就加临界区进行同步,用的是
EnterCriticalSection(CriticalSection);   //进入临界区

LeaveCriticalSection(CriticalSection);  //离开临界区程序中还有一个定时器,每过15秒触发一次,触发后先Timer1.Enabled:=False;  等函数完了再在函数末尾:
Timer1.Enabled:=True;   定时器函数过程中也有数据库操作,所以也加了临界区进行同步。现在开5个客户端进行请求来测试,结果用不了1分钟程序就没响应,也没有异常。
不开定时器就没事,定时器函数不加临界区也没事。我在定时器函数里面加了一系列语句  memo1.Lines.Add  在memo中显示,结果在执行EnterCriticalSection(CriticalSection)前边都显示出来了,也就是说执行 EnterCriticalSection(CriticalSection); 导致程序没响应,请问这是怎么回事,按理说这个语句就算2个线程同时到只一句也不该没响应啊  

解决方案 »

  1.   

    EnterCriticalSection(CriticalSection);  //进入临界区 

    会不会你在这之间的代码异常,或者有exit 这些跳过了(LeaveCriticalSection)呢?
    LeaveCriticalSection(CriticalSection);  //离开临界区 
    这样试式看
    EnterCriticalSection(CriticalSection);  //进入临界区 
    try
      code ......
    finally
      LeaveCriticalSection(CriticalSection);  
    end;
      

  2.   

    我都是这个格式定时器显示里边也把finally里边离开临界区时显示了一下,现实表明,没响应这次的前一次离开了临界区finally
        memo1.Lines.Add('00000000');
        LeaveCriticalSection(CriticalSection);  //离开临界区
        memo1.Lines.Add('aaaaaaaaaaa');
        .......
        Timer1.Enabled:=True;end;
      

  3.   

    EnterCriticalSection(CriticalSection);  //定时器执行时等待直到CriticalSection被释放.主线程等待就会像死机一样.可以再开个线程代替定时器操作,起码不会死机.