1,183
社区成员
发帖
与我相关
我的任务
分享
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;
p_Logs('监控组:[' + FieldByName('RoomCode').AsString + ']启动.', False);
DMDM.OpenConsume(RoomID[i], FormatDateTime('ddddd', Now),Kind[i]);
//给监控对像的成员变量赋值 Jeff 2013.04.30
RoomGroup[i]:=TRoomGroup.Create;
RoomGroup[i].RoomCode := RoomID[i];
RoomGroup[i].TimeStr := FormatDateTime('ddddd', Now);
RoomGroup[i].Code := Kind[i];
RunThread[i].Resume;//线程启动 Jeff 2013.04.30
ToolButton2.Caption := '停止监控';
//sleep(1000);
end;
end;
i := i+1;
//当前时间与当前分组的消费时段进行比对;
Next;
end;
end;
QY.Destroy;
end;
unit Define;
interface
uses
Classes,Forms,Controls,Windows,comctrls,stdctrls,EastRiver, EastRiverD,Sysutils,grids,Dialogs;
type
//定义监控组线程对象
TRunThread = class(TThread)
private
protected
procedure RuningRoom; //线程监控分组运行
procedure Runing(RoomGroupID:Integer); //线程监控分组运行
procedure Execute; override;
public
RoomGroupID:Integer;
end;
//定义监控分组对象
TRoomGroup = class
private
protected
public
RoomCode:String; //分组号
TimeStr:String; //监控日期
Code:integer; //当前监控分组的餐别
Procedure Continuerun(RoomGroupID:Integer); //继续运行
end;
var
RoomGroup:array[0..9] of TRoomGroup; //监控分组实例对象
RunThread:array[0..9] of TRunThread; //运行控分组线程实例对象
CS: TRTLCriticalSection;//多线程临界区定义
RealRec:TRealRecordInfo;
implementation
uses realtime, DM, FuncPassWord;
{ TRunThread }
procedure TRunThread.Execute;
begin
while not self.Terminated DO
begin
// Synchronize(RuningRoom);
EnterCriticalSection(CS);
try
RuningRoom;
finally
LeaveCriticalSection(CS);
end;
// sleep(50);
end;
end;
procedure TRunThread.Runing(RoomGroupID:Integer);
begin
RoomGroup[RoomGroupID].Continuerun(RoomGroupID);
// Application.ProcessMessages;
end;
procedure TRunThread.RuningRoom;
begin
Runing(RoomGroupID);
end;
{ TRoomGroup }
procedure TRoomGroup.Continuerun(RoomGroupID:Integer);
var
i: Integer;
CID: integer;
begin
for i:=0 to DMDM.DeviceStrList[RoomGroupID].Count-1 Do
begin
CID := StrToInt('$'+DMDM.DeviceStrList[RoomGroupID].Strings[i]);
frmrealtime.Label5.Caption := '正在等待消费机:[' + DMDM.DeviceStrList[RoomGroupID].Strings[i] + ']最后一次刷卡...';
//frmRealTime.p_Logs('正在等待消费机:[' + DMDM.DeviceStrList[RoomGroupID].Strings[i] + ']最后一次刷卡...', false);
if RealReadRecord(frmRealTime.hPort,CID,@RealRec) then
begin
if RealRec.NoCard then
//frmRealTime.p_Logs('消费机:[' + IntToStr(CID) + ']上没有卡片...', false)
else
begin
if RealRec.Consume <> 0 then
begin
frmRealTime.CurMoney := frmRealTime.CurMoney - RealRec.Consume;
EastRiverD.RealFeedback(frmRealTime.hPort,CID,frmRealTime.CurMoney,-1, 0)
end
else
EastRiverD.RealFeedback(frmRealTime.hPort,CID,frmRealTime.CurMoney,-1, 0);
end;
end;
// else
// frmRealTime.p_Logs('消费机:[' + IntToStr(CID) + ']不在线...', false);
end;
end;
end.
procedure TRunThread.Execute;
begin
FStop := False;
//这里面已经把FStop变成了False;那后面的if FStop then判断,会起作用吗,这里面的执行顺序我有点混 乱,还望大大解释一下
while not self.Terminated DO
begin
// Synchronize(RuningRoom);
EnterCriticalSection(CS);
try
RuningRoom;
finally
LeaveCriticalSection(CS);
end;
// sleep(50);
if FStop then//上面已经把FStop为false了,这里会执行吗???
Suspend;
end;
end;