SmsTraffic.cpp
资源名称:msgctrl.rar [点击查看]
上传用户:ynthgy
上传日期:2022-06-13
资源大小:1580k
文件大小:7k
源码类别:
手机短信编程
开发平台:
Visual C++
- // SmsTraffic.cpp: implementation of the CSmsTraffic class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "SmsTraffic.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- HANDLE hSmsThread; //短消息收发处理子线程句柄
- DWORD SmsThreadID; //短消息收发处理子线程标识符
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- // 构造函数
- CSmsTraffic::CSmsTraffic()
- {
- m_nSendIn = 0; //发送队列的输入指针置0
- m_nSendOut = 0; //发送队列的输出指针置0
- m_nRecvIn = 0; //接受队列的输入指针置0
- m_nRecvOut = 0; //接受队列的输出指针置0
- m_hKillThreadEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); //通知子线程关闭的事件
- m_hThreadKilledEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); //子线程宣告关闭的事件
- ::InitializeCriticalSection(&m_csSend); //初始化与发送相关的临界段
- ::InitializeCriticalSection(&m_csRecv); //初始化与接受相关的临界段
- //启动子线程
- hSmsThread = CreateThread(0,0,SmThread,this,0,&SmsThreadID);
- //设置线程优先级
- SetThreadPriority(hSmsThread, THREAD_PRIORITY_NORMAL);
- }
- // 析构函数
- CSmsTraffic::~CSmsTraffic()
- {
- ::SetEvent(m_hKillThreadEvent); // 发出关闭子线程的信号
- ::WaitForSingleObject(m_hThreadKilledEvent, INFINITE); // 等待子线程关闭
- ::DeleteCriticalSection(&m_csSend); //删除与发送相关的临界段
- ::DeleteCriticalSection(&m_csRecv); //删除与接受相关的临界段
- ::CloseHandle(m_hKillThreadEvent); //关闭通知子线程关闭的事件
- ::CloseHandle(m_hThreadKilledEvent); //关闭子线程宣告关闭的事件
- }
- // 将一条短消息放入发送队列
- void CSmsTraffic::PutSendMessage(SM_PARAM* pSmParam)
- {
- ::EnterCriticalSection(&m_csSend); //进入与发送相关的临界段
- ::memcpy(&m_SmSend[m_nSendIn], pSmParam, sizeof(SM_PARAM)); //将一条短消息放入发送队列
- m_nSendIn++; //发送队列的输入指针加1
- if(m_nSendIn >= MAX_SM_SEND) //发送队列的输入指针大于等于发送队列长度
- m_nSendIn = 0; //发送队列的输入指针置0
- ::LeaveCriticalSection(&m_csSend); //离开与发送相关的临界段
- }
- // 从发送队列中取一条短消息
- BOOL CSmsTraffic::GetSendMessage(SM_PARAM* pSmParam)
- {
- BOOL fSuccess = FALSE; //无短消息
- ::EnterCriticalSection(&m_csSend); //进入与发送相关的临界段
- if(m_nSendOut != m_nSendIn) //发送队列的输出指针不等于发送队列的输入指针
- {
- ::memcpy(pSmParam, &m_SmSend[m_nSendOut], sizeof(SM_PARAM)); //从发送队列中取一条短消息
- m_nSendOut++; //发送队列的输出指针加1
- if(m_nSendOut >= MAX_SM_SEND) //发送队列的输出指针大于等于发送队列长度
- m_nSendOut = 0; //发送队列的输出指针置0
- fSuccess = TRUE; //有短消息
- }
- ::LeaveCriticalSection(&m_csSend); //离开与发送相关的临界段、
- return fSuccess;
- }
- // 将一条短消息放入接收队列
- void CSmsTraffic::PutRecvMessage(SM_PARAM* pSmParam)
- {
- ::EnterCriticalSection(&m_csRecv); //进入与接受相关的临界段
- ::memcpy(&m_SmRecv[m_nRecvIn], pSmParam, sizeof(SM_PARAM)); //将一条短消息放入接受队列
- m_nRecvIn++; //接受队列的输入指针加1
- if(m_nRecvIn >= MAX_SM_RECV) //接受队列的输入指针大于等于接受队列长度
- m_nRecvIn = 0; //接受队列的输入指针置0
- ::LeaveCriticalSection(&m_csRecv); //离开与接受相关的临界段
- }
- // 从接收队列中取一条短消息
- BOOL CSmsTraffic::GetRecvMessage(SM_PARAM* pSmParam)
- {
- BOOL fSuccess = FALSE; //无短消息
- ::EnterCriticalSection(&m_csRecv); //进入与接受相关的临界段
- if(m_nRecvOut != m_nRecvIn) //接受队列的输出指针不等于接受队列的输入指针
- {
- ::memcpy(pSmParam, &m_SmRecv[m_nRecvOut], sizeof(SM_PARAM)); //从接受队列中取一条短消息
- m_nRecvOut++; //接受队列的输出指针加1
- if(m_nRecvOut >= MAX_SM_RECV) //接受队列的输出指针大于等于接受队列长度
- m_nRecvOut = 0; //接受队列的输出指针置0
- fSuccess = TRUE; //有短消息
- }
- ::LeaveCriticalSection(&m_csRecv); //离开与接受相关的临界段
- return fSuccess;
- }
- // 短消息收发处理子线程
- DWORD CALLBACK CSmsTraffic::SmThread(LPVOID lParam)
- {
- CSmsTraffic* p=(CSmsTraffic *)lParam; // this
- int nMsg; // 收到短消息条数
- int nDelete; // 目前正在删除的短消息编号
- int i;
- int nCount = 0; //删除次数
- SM_PARAM SmParam[128]; // 短消息缓冲区
- //枚举类型
- enum {
- stHaveRest, // 休息,延时
- stGetSendMessage, // 取一条待发送的短消息
- stDoSendMessage, // 发送短消息
- stSendWaitIdle, // 发送不成功,等待GSM就绪
- stDoRecvMessage, // 接收短消息
- stPutRecvMessage, // 储存接收的短消息
- stDeleteMessage, // 删除短消息
- stDeleteWaitIdle, // 删除不成功,等待GSM就绪
- stExit // 退出
- } nState; // 处理过程的状态
- nState = stHaveRest;// 休息,延时
- // 发送和接收处理的大循环
- while(nState != stExit)
- {
- switch(nState)
- {
- case stHaveRest:// 休息,延时
- ::Sleep(1000);//延时1秒
- nState = stGetSendMessage;// 取一条待发送的短消息
- break;
- case stGetSendMessage:// 取一条待发送的短消息
- if(p->GetSendMessage(&SmParam[0]))// 从发送队列中取一条短消息
- nState = stDoSendMessage;//有短消息 发送短消息
- else
- nState = stDoRecvMessage;//无短消息 接收短消息
- break;
- case stDoSendMessage:// 发送短消息
- if(::gsmSendMessage(&SmParam[0]))
- {
- ::Sleep(10000);//延时10s
- nState = stHaveRest;// 休息,延时
- }
- else
- {
- nState = stSendWaitIdle;// 发送不成功,等待GSM就绪
- }
- break;
- case stSendWaitIdle:// 发送不成功,等待GSM就绪
- ::Sleep(1000);//延时1s
- nState = stDoSendMessage;// 发送短消息
- break;
- case stDoRecvMessage:// 接收短消息
- nMsg = ::gsmReadMessage(SmParam);
- if(nMsg > 0)
- nState = stPutRecvMessage;// 储存接收的短消息
- else
- nState = stHaveRest;// 休息,延时
- break;
- case stPutRecvMessage:// 储存接收的短消息
- for(i = 0; i < nMsg; i++)
- p->PutRecvMessage(&SmParam[i]);// 将一条短消息放入接收队列
- nState = stDeleteMessage;// 删除短消息
- nDelete = 0;
- break;
- case stDeleteMessage:// 删除短消息
- if(nDelete < nMsg)
- {
- if(::gsmDeleteMessage(SmParam[nDelete].index) || (nCount>=3))
- {
- nCount = 0;
- nDelete++;
- }
- else
- {
- nState = stDeleteWaitIdle;
- }
- }
- else
- nState = stHaveRest;// 休息,延时
- break;
- case stDeleteWaitIdle:// 删除不成功,等待GSM就绪
- ::Sleep(1000);//延时1s
- nState = stDeleteMessage;// 删除短消息
- ++nCount;
- break;
- }
- // 检测是否有关闭本线程的信号 //通知子线程关闭的事件
- DWORD dwEvent = ::WaitForSingleObject(p->m_hKillThreadEvent, 20);
- if(dwEvent == WAIT_OBJECT_0)
- nState = stExit;
- }
- // 置该线程结束标志
- ::SetEvent(p->m_hThreadKilledEvent);//子线程宣告关闭的事件
- return 9999;
- }