线程,太伤人了!该如何解决
线程,太伤人了!!!!!!
各位大大,我把控制线程启动和挂起的操作写在一个Timer的Ontimer事件中,在消费时间内启动线程,不在消费时间内则挂起线程,等待下次在消费时间内再Resume,ZQ_Consume_MealRoom 表中有三个分组,通过线程数组创建三个监控线程。
现在的问题来了,第一个和第二个线程Suspend后,第三个线程也不工作了(第三个还是在消费时间内的),等到第一个和第二个Resume后,第三个又可以正常运行了,问题点找不到,太受伤了。
onTimer代码如下 :
各位大大,我把控制线程启动和挂起的操作写在一个Timer的Ontimer事件中,在消费时间内启动线程,不在消费时间内则挂起线程,等待下次在消费时间内再Resume,ZQ_Consume_MealRoom 表中有三个分组,通过线程数组创建三个监控线程。
现在的问题来了,第一个和第二个线程Suspend后,第三个线程也不工作了(第三个还是在消费时间内的),等到第一个和第二个Resume后,第三个又可以正常运行了,问题点找不到,太受伤了。
onTimer代码如下 :
procedure Tfrmrealtime.StartTimerTimer(Sender: TObject);
var
QY: TADOQuery;
Code: integer; //用于判断是否在消费时段的变量;
i: Integer;
begin
//RoomCode,Tag 两个一维数组,RoomCode用于保存监控组编号;Tag用于保存启动标识 :Jeff 2013.04.28
i := 0;
QY := TADOQuery.Create(self);
QY.Connection := DMDM.CONN;
with QY do
begin
Close;
SQL.Clear;
SQL.Add(' select RoomCode from ZQ_Consume_MealRoom ');
try
Open;
except
ExecSQL;
end;
while not Eof do
begin
if not SameText(RoomID[i],FieldByName('RoomCode').AsString) then
RoomID[i] := FieldByName('RoomCode').AsString;
Code := DMDM.F_IsMealConsumeTime(FieldByName('RoomCode').AsString, FormatDateTime('hh:nn', Now));
if Code = 0 then
begin
if Tags[i] <> -1 then
begin
Tags[i] := -1;
p_Logs('监控组:[' + FieldByName('RoomCode').AsString + ']不在消费时段,监控结束.', true);
if CheckThreadFreed(RunThread[i])=1 then
begin
RunThread[i].Suspend;//线程挂超 Jeff 2013.04.30
end;
end;
end
else
begin
if Tags[i] <> 1 then
begin
Tags[i] := 1;
Kind[i] := Code;