⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitsendmsgthread.pas

📁 串口短信猫收发软件。支持西门子TC35i设备
💻 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 + -