📄 unitsendmsgthread.pas
字号:
{*******************************************************}
{ }
{ 名称:TSendMsgThread类 }
{ 功能: }
{ 1.发送收短信线程 }
{ 调用: }
{ 1.随主窗体创建,按启动按钮后开始执行 }
{*******************************************************}
unit UnitSendMsgThread;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ComCtrls, RzListVw, RzStatus, UnitPublicFun, UnitModemPool, UnitModem;
type
TSendMsgThread = class(TThread)
private
FSleepInterval: integer;
FMPool: TModemPool;
FMsgNum: integer;
FMsgArray: array[0..(MAX_PER_DO_NUM-1)] of TRecieveSMS; //存放发送短信的记录数组
FErrorType, FCommName, FDoType, FMsg: string;
FAfterProcessing: TAfterProcessingEvent;
FShowMsg: TShowMsgEvent;
FMsgList: TStrings;
procedure CallAfterProcessing;
procedure CallShowMsg;
procedure SendMsg;
procedure ClearMsgArray;
protected
procedure Execute; override;
procedure DoAfterProcessing;
procedure DoShowMsg;
public
constructor Create(MPool: TModemPool; CreateSuspended: Boolean; SleepInterval: integer);
destructor Destroy; override;
property AfterProcessing: TAfterProcessingEvent read FAfterProcessing write FAfterProcessing;
property ShowMsg: TShowMsgEvent read FShowMsg write FShowMsg;
end;
implementation
uses UnitDM;
procedure TSendMsgThread.DoAfterProcessing;
begin
if Assigned(FAfterProcessing) then Synchronize(CallAfterProcessing);
end;
procedure TSendMsgThread.CallAfterProcessing;
begin
if Assigned(FAfterProcessing) then
FAfterProcessing(Self, DOSENDMSG, FMsgList);
end;
constructor TSendMsgThread.Create(MPool: TModemPool;
CreateSuspended: Boolean; SleepInterval: integer);
begin
FMPool := MPool;
FSleepInterval := SleepInterval;
FreeOnTerminate := True;
FDoType := DOTYPE_SENDMSG;
FMsgList := TStringList.Create;
inherited Create(CreateSuspended);
end;
destructor TSendMsgThread.Destroy;
begin
FMsgList.Free;
inherited;
end;
procedure TSendMsgThread.Execute;
begin
while not Terminated do
begin
try
{
FErrorType := '';
FCommName := DOTYPE_SENDMSG;
FMsg := '开始检测可发送短信...';
DoShowMsg;
}
SendMsg;
{
FErrorType := '';
FCommName := DOTYPE_SENDMSG;
FMsg := '结束检测可发送短信!';
DoShowMsg;
}
Sleep(FSleepInterval);
except
continue;
end;
end;
end;
procedure TSendMsgThread.SendMsg;
var
i: integer;
nowtime: string;
bResult: boolean;
m: TModem;
begin
FMsgNum := 0;
ClearMsgArray;
bResult := DM.QueryRequest(FMsgNum, FMsgArray);//从数据库提取要发送的记录,每次最多MAX_PER_DO_NUM条
if not bResult then
begin
FErrorType := '';
FCommName := SYSTEM_DEVICE;
FMsg := '没检测到可发送短信';
DoShowMsg;
Exit;
end;
for i:=0 to FMsgNum-1 do
begin
m := FMPool.LookupRandomModem(FMsgArray[i].MsgMobile);
if m=nil then
begin
FErrorType := DO_ERROR;
FCommName := SYSTEM_DEVICE;
FMsg := '查找通讯设备失败';
DoShowMsg;
break;
end;
nowtime := FormatDateTime(FORMATDATETIME_DEF, Now);//时间
if m.SendPduSMS(FMsgArray[i].MsgData, FMsgArray[i].MsgMobile) then//发送成功
begin
DM.UpdateRequest(FMsgArray[i].MsgIndex, FMsgArray[i].MsgMobile, '1', nowtime, IntToStr(m.NetDefine));
FMsgList.Clear;
FMsgList.Add(m.CommName);
FMsgList.Add(FMsgArray[i].MsgIndex);
FMsgList.Add(FMsgArray[i].MsgMobile);
FMsgList.Add(nowtime);
FMsgList.Add(FMsgArray[i].MsgData);
DoAfterProcessing;//触发主窗体调用事件
FErrorType := '';
FMsg := '短信发送成功['+FMsgArray[i].MsgMobile+']';
end
else//发送失败
begin
DM.UpdateRequest(FMsgArray[i].MsgIndex, FMsgArray[i].MsgMobile, '0', nowtime, IntToStr(m.NetDefine));
FErrorType := DO_ERROR;
FMsg := '短信发送失败['+FMsgArray[i].MsgMobile+']';
end;
FCommName := m.CommName;
DoShowMsg;
end;
end;
procedure TSendMsgThread.CallShowMsg;
begin
if Assigned(FShowMsg) then
FShowMsg(Self, FErrorType, FCommName, FDoType, FMsg);
end;
procedure TSendMsgThread.DoShowMsg;
begin
if Assigned(FShowMsg) then Synchronize(CallShowMsg);
end;
procedure TSendMsgThread.ClearMsgArray;
var
i: integer;
begin
for i:=0 to MAX_PER_DO_NUM-1 do
begin
FMsgArray[i].MsgIndex := NO_SMS;
FMsgArray[i].MsgDate := '';
FMsgArray[i].MsgMobile := '';
FMsgArray[i].MsgData := '';
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -