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

📄 移动短信.txt

📁 在编写程序中还用到了开发工具Borland.C++.Builder.6.0
💻 TXT
字号:
接收代码
#include <vcl.h>
#pragma hdrstop

#include "RecvThread.h"
#include "funtion.h"
#include "Main.h"
#pragma package(smart_init)
//-------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TRecvThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//-------------------------------------------------------------------

__fastcall TRecvThread::TRecvThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
    FrmMain->WriteMemo(eRecv,"接收线程开始运行.");
}
//-------------------------------------------------------------------
void __fastcall TRecvThread::Execute()
{
    //---- Place thread code here ----
    int iRecvNum = 0;
    int status;
    RecvBody node;
    while(int i = login(&RecvConn,s_ip,i_port,s_user,s_pwd,1))
    {
          //显示连接出错,停N秒后重试, 不要忘了显示i
          FrmMain->WriteMemo(eStatus,"接收型连接错误,错误代码:" + IntToStr(i));
          FrmMain->WriteMemo(eStatus,"30秒后重新尝试连接...");
          Sleep(30000);
    }
    FrmMain->WriteMemo(eStatus,"接收型连接成功");
    while(!Terminated)
    {
        status = Recv_MO(&RecvConn,&node);
        if(status > 0)
        {
            FrmMain->WriteMemo(eStatus,"接收短信出错,错误代码:"+ IntToStr(status));
            logout(&RecvConn);
            while(int i = login(&RecvConn,s_ip,i_port,s_user,s_pwd,1))
            {
                //显示连接出错,停N秒后重试, 不要忘了显示i
                FrmMain->WriteMemo(eStatus,"接收型连接错误,错误代码:" + IntToStr(i));
                FrmMain->WriteMemo(eStatus,"30秒后重新尝试连接...");
                Sleep(30000);
            }
            FrmMain->WriteMemo(eStatus,"接收型连接成功");
        }
        else
        {
            if(node.sOrgAddr.IsEmpty())
                continue;
            rwLock->BeginWrite();//写临界变量,锁定
            lstRecv.push_back(node);
            rwLock->EndWrite(); //开锁

            iRecvNum++;
            FrmMain->WriteStatus(eRecv-1,"接收短信:" + IntToStr(iRecvNum) + "条");
            AnsiString str;
            str.sprintf("%s ---> %s ### %s",node.sOrgAddr,node.sDestAddr,node.sContent);
            FrmMain->WriteMemo(eRecv,str);
            /*try
            {
                FrmMain->LogProc->Params->Items[0]->AsString = node.sOrgAddr;
                FrmMain->LogProc->Params->Items[1]->AsString = node.sDestAddr;
                FrmMain->LogProc->Params->Items[2]->AsString = node.sContent;
                FrmMain->LogProc->Params->Items[3]->AsString = "";
                FrmMain->LogProc->Params->Items[4]->AsBCD = 0;
                FrmMain->LogProc->Params->Items[5]->AsBCD = 0;
                FrmMain->LogProc->Params->Items[6]->AsBCD = 0;
                FrmMain->LogProc->ExecProc();
            }
            catch(Exception &e)
            {
                FrmMain->WriteMemo(eStatus,"记录过程出错" + e.Message);
            }*/
        }
        if(!lstRecv.empty())
            ReleaseSemaphore(SemProcess,1,NULL);
    }
    logout(&RecvConn);
    FrmMain->WriteMemo(eRecv,"接收线程结束");
}

处理进程代码
#include <vcl.h>
#pragma hdrstop

#include "ProcessThread.h"
#include "funtion.h"
#include "Main.h"
#pragma package(smart_init)
//-------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TProcessThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//-------------------------------------------------------------------

__fastcall TProcessThread::TProcessThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
    FrmMain->WriteMemo(eProcess,"处理线程开始运行.");
}
//-------------------------------------------------------------------
void __fastcall TProcessThread::Execute()
{
    //---- Place thread code here ----
    int iProcessNum = 0;
    RecvBody node;
    SendBody snode;
    AnsiString Str,sOrg,sDest,sContent;
    strList lstOrg,lstDest,lstContent;
    strList::iterator Orgitor;
    strList::iterator Destitor;
    strList::iterator Conitor;
    strList::iterator itor;


    FrmMain->DBXConn();
    while(!Terminated)
    {
        if(!lstSend.empty())
             ReleaseSemaphore(SemSend,1,NULL);

        if(lstRecv.empty())
            WaitForSingleObject(SemProcess,INFINITE);
        if(lstRecv.empty() || Terminated)
            continue;

        rwLock->BeginRead();
        node = lstRecv.front();
        rwLock->EndRead();

        rwLock->BeginWrite();
        lstRecv.pop_front();
        rwLock->EndWrite();

        iProcessNum++;
        FrmMain->WriteStatus(eProcess-1,"处理短信:" + IntToStr(iProcessNum) + "条");

        Str.sprintf("参数传入:%s|%s###%s",node.sOrgAddr,node.sDestAddr,node.sContent);
        FrmMain->WriteMemo(eProcess,Str);

        try
        {
            //int i = FrmMain->ProcessProc->Params->Count;

            FrmMain->ProcessProc->Params->Items[0]->AsString = node.sOrgAddr;
            FrmMain->ProcessProc->Params->Items[1]->AsString = node.sDestAddr;
            FrmMain->ProcessProc->Params->Items[2]->AsString = node.sContent;
            FrmMain->ProcessProc->ExecProc();

            sOrg = FrmMain->ProcessProc->Params->Items[3]->AsString;
            sDest = FrmMain->ProcessProc->Params->Items[4]->AsString;
            sContent = FrmMain->ProcessProc->Params->Items[5]->AsString;

            snode.sSvc_Type = FrmMain->ProcessProc->Params->Items[6]->AsString;
            snode.iInfo_Fee = FrmMain->ProcessProc->Params->Items[7]->AsInteger;
            snode.iFee_User_Type = FrmMain->ProcessProc->Params->Items[8]->AsInteger;
            snode.iFee_Type = FrmMain->ProcessProc->Params->Items[9]->AsInteger;
            snode.sFee_User = FrmMain->ProcessProc->Params->Items[10]->AsString;
        }
        catch(Exception &e)
        {
            FrmMain->WriteMemo(eStatus,"存储过程执行中出错!" + e.Message);
            FrmMain->DBXConn();
        }

        snode.iSendFailure = 0;
        //---------------传出数据的处理--------------------
        lstOrg = DeliStrConvert(sOrg,"|");
        lstDest = DeliStrConvert(sDest,"|");
        lstContent = DeliStrConvert(sContent,"|");

        //MMM
        if(lstOrg.size() == lstDest.size() && lstOrg.size() == lstContent.size())
        {
            Orgitor = lstOrg.begin();
            Destitor = lstDest.begin();
            Conitor = lstContent.begin();
            while(Destitor != lstDest.end())
            {
                snode.sDestAddr = *Destitor++;
                snode.sOrgAddr = *Orgitor++;
                snode.sContent = *Conitor++;

                rwLock->BeginWrite();
                lstSend.push_back(snode);
                rwLock->EndWrite();

                Str = snode.sOrgAddr + "-->" + snode.sDestAddr + ">>>>>"
                    + snode.sContent + "|" +snode.sSvc_Type + "|"
                    + IntToStr(snode.iInfo_Fee) + "|" + IntToStr(snode.iFee_User_Type)
                    + "|" + IntToStr(snode.iFee_Type);
                FrmMain->WriteMemo(eProcess,"处理结果:" + Str);
            }
            continue;
        }
       FrmMain->WriteMemo(eStatus,"过程参数传出不在可处理的范围内.");
    }
    FrmMain->WriteMemo(eProcess,"处理线程结束");
}

关于处理过程再举个在Oracle上的一个存储过程的实例:(移动的欢乐家庭投票过程)
CREATE OR REPLACE PROCEDURE BAOWL_health_family_PROC --主过程
( RECV_ORG IN  VARCHAR2,RECV_DEST IN  VARCHAR2,RECV_CONTENT IN VARCHAR2,
 SEND_ORG OUT VARCHAR2,SEND_DEST OUT VARCHAR2,MSG OUT VARCHAR2,
 SVC_TYPE OUT VARCHAR2,INFO_FEE OUT NUMBER,FEE_USER_TYPE OUT NUMBER,FEE_TYPE OUT NUMBER,FEE_USER OUT VARCHAR2)
AS
  
BEGIN
  SEND_ORG:=RECV_DEST;
  SEND_DEST:=RECV_ORG;
  
  SVC_TYPE:='HELP';
  INFO_FEE:=0;      --
  FEE_USER_TYPE:=0;  --对目标终端收费
  FEE_TYPE:=1;	     --免费
  FEE_USER:='';
    
  IF to_char(sysdate,'yyyymmdd') > '20051223' THEN
     MSG := '尊敬的用户,此活动已经结束!';
     RETURN;
  END IF;
  
  IF TO_NUMBER(trim(RECV_CONTENT)) > 0 AND
     TO_NUMBER(trim(RECV_CONTENT)) < 11 THEN
      INSERT INTO  baowl_health_family 
           VALUES  (RECV_ORG,
                    sysdate,
                    TO_NUMBER(RECV_CONTENT));
      COMMIT;
      MSG :=  '你已成功投票给' || trim(RECV_CONTENT) || '号家庭,谢谢你投上宝贵的一票!';
      RETURN;
  END IF;

  MSG :=  '请选择正确的家庭号码(1到10号),谢谢你的参与!';
  RETURN;

  exception when others then
   MSG :=  '请选择正确的家庭号码(1到10号),谢谢你的参与!';
   RETURN;
  
END;

发送进程代码
#include <vcl.h>
#pragma hdrstop

#include "SendThread.h"
#include "funtion.h"
#include "Main.h"
#pragma package(smart_init)
//-------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TSendThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//-------------------------------------------------------------------

__fastcall TSendThread::TSendThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
    FrmMain->WriteMemo(eSend,"发送线程开始运行.");
}
//-------------------------------------------------------------------
void __fastcall TSendThread::Execute()
{
    //---- Place thread code here ----
    int iSendNum = 0;
    AnsiString str;
    int status;
    SendBody node;
    while(int i = login(&SendConn,s_ip,i_port,s_user,s_pwd,0))
    {
          //显示连接出错,停N秒后重试, 不要忘了显示i
          FrmMain->WriteMemo(eStatus,"发送型连接错误,错误代码:" + IntToStr(i));
          FrmMain->WriteMemo(eStatus,"30秒后重新尝试连接...");
          Sleep(30000);
    }
    FrmMain->WriteMemo(eStatus,"发送型连接成功");

    while(!Terminated)
    {
        if(lstSend.empty())
            WaitForSingleObject(SemSend,INFINITE);

        if(lstSend.empty() || Terminated)
            continue;

        rwLock->BeginRead();
        node = lstSend.front();
        rwLock->EndRead();

        rwLock->BeginWrite();
        lstSend.pop_front();
        rwLock->EndWrite();

        if(node.sOrgAddr.IsEmpty() || node.sDestAddr.IsEmpty() || node.sContent.IsEmpty())
            continue;

        iSendNum++;
        FrmMain->WriteStatus(int(eSend)-1,"发送短信:" + IntToStr(iSendNum) + "条");
        cmppe_submit cs;
        cmppe_submit_sm_init(&cs);

        //设置短信内容(固定的)
        strcpy(cs.icp_id,s_user);

        cs.priority = 9;
        cs.msg_mode = 1;
        cs.proto_id = 1;
        cs.data_coding = 15;
        strcpy(cs.schedule,"");
        strcpy(cs.validate,"");
        cs.du_count = 1;
        strcpy(cs.fee_user,"");

        //设置短信内容(从队列中取)
        strcpy(cs.short_msg,node.sContent.c_str());
        cs.sm_len = strlen(node.sContent.c_str());

        strcpy(cs.src_addr,node.sOrgAddr.c_str());
        strcpy(cs.dst_addr[0],node.sDestAddr.c_str());
        strcpy(cs.svc_type,node.sSvc_Type.c_str());
        cs.fee_type = node.iFee_Type;
        cs.info_fee = node.iInfo_Fee;
        cs.fee_utype = node.iFee_User_Type;
        strcpy(cs.fee_user,node.sFee_User.c_str());

        //短信发送
        status = SendMessage(&SendConn,cs);

        str = IntToStr(status) +"   "+ node.sOrgAddr + "-->" + node.sDestAddr + ">>>>>"
            + node.sContent + "|" +node.sSvc_Type + "|"
            + IntToStr(node.iInfo_Fee) + "|" + IntToStr(node.iFee_User_Type)
            + "|" + IntToStr(node.iFee_Type);
        FrmMain->WriteMemo(eSend,"短信发送:" + str);
        if(status >0)
        {
            if(node.iSendFailure < i_resend)
            {
                node.iSendFailure++;
                rwLock->BeginWrite();
                lstSend.push_back(node);
                rwLock->EndWrite();
            }
            if(status != SEND_SMG_ERR  || status != SEND_REV_ERR)
            {
                FrmMain->WriteMemo(eStatus,"发送短信出错,错误代码:"+ IntToStr(status));
                logout(&SendConn);
                while(int i = login(&SendConn,s_ip,i_port,s_user,s_pwd,0))
                {
                    //显示连接出错,停N秒后重试, 不要忘了显示i
                    FrmMain->WriteMemo(eStatus,"发送型连接错误,错误代码:" + IntToStr(i));
                    FrmMain->WriteMemo(eStatus,"30秒后重新尝试连接...");
                    Sleep(30000);
                }
                FrmMain->WriteMemo(eStatus,"发送型连接成功");
            }
        }
        else
        {
            /*try
            {
                FrmMain->LogProc->Params->Items[0]->AsString = node.sOrgAddr;
                FrmMain->LogProc->Params->Items[1]->AsString = node.sDestAddr;
                FrmMain->LogProc->Params->Items[2]->AsString = node.sContent;
                FrmMain->LogProc->Params->Items[3]->AsString = node.sSvc_Type;
                FrmMain->LogProc->Params->Items[4]->AsBCD = node.iInfo_Fee;
                FrmMain->LogProc->Params->Items[5]->AsBCD = node.iFee_User_Type;
                FrmMain->LogProc->Params->Items[6]->AsBCD = node.iFee_Type;
                FrmMain->LogProc->ExecProc();
            }
            catch(Exception &e)
            {
                FrmMain->WriteMemo(eStatus,"记录过程出错" + e.Message);
            }*/
        }

    }
    logout(&SendConn);
    FrmMain->WriteMemo(eSend,"发送线程结束");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -