我的程序,接收客户端的请求,然后开线程去处理,处理过程中遇到数据库操作,就加临界区进行同步,用的是
EnterCriticalSection(CriticalSection); //进入临界区
。
LeaveCriticalSection(CriticalSection); //离开临界区程序中还有一个定时器,每过15秒触发一次,触发后先Timer1.Enabled:=False; 等函数完了再在函数末尾:
Timer1.Enabled:=True; 定时器函数过程中也有数据库操作,所以也加了临界区进行同步。现在开5个客户端进行请求来测试,结果用不了1分钟程序就没响应,也没有异常。
不开定时器就没事,定时器函数不加临界区也没事。我在定时器函数里面加了一系列语句 memo1.Lines.Add 在memo中显示,结果在执行EnterCriticalSection(CriticalSection)前边都显示出来了,也就是说执行 EnterCriticalSection(CriticalSection); 导致程序没响应,请问这是怎么回事,按理说这个语句就算2个线程同时到只一句也不该没响应啊
EnterCriticalSection(CriticalSection); //进入临界区
。
LeaveCriticalSection(CriticalSection); //离开临界区程序中还有一个定时器,每过15秒触发一次,触发后先Timer1.Enabled:=False; 等函数完了再在函数末尾:
Timer1.Enabled:=True; 定时器函数过程中也有数据库操作,所以也加了临界区进行同步。现在开5个客户端进行请求来测试,结果用不了1分钟程序就没响应,也没有异常。
不开定时器就没事,定时器函数不加临界区也没事。我在定时器函数里面加了一系列语句 memo1.Lines.Add 在memo中显示,结果在执行EnterCriticalSection(CriticalSection)前边都显示出来了,也就是说执行 EnterCriticalSection(CriticalSection); 导致程序没响应,请问这是怎么回事,按理说这个语句就算2个线程同时到只一句也不该没响应啊
。
会不会你在这之间的代码异常,或者有exit 这些跳过了(LeaveCriticalSection)呢?
LeaveCriticalSection(CriticalSection); //离开临界区
这样试式看
EnterCriticalSection(CriticalSection); //进入临界区
try
code ......
finally
LeaveCriticalSection(CriticalSection);
end;
memo1.Lines.Add('00000000');
LeaveCriticalSection(CriticalSection); //离开临界区
memo1.Lines.Add('aaaaaaaaaaa');
.......
Timer1.Enabled:=True;end;