?? 移動短信.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 + -