?? smstraffic.cpp
字號:
// SmsTraffic.cpp: implementation of the CSmsTraffic class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SmsTest.h"
#include "SmsTraffic.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSmsTraffic::CSmsTraffic()
{
m_nSendIn = 0;
m_nSendOut = 0;
m_nRecvIn = 0;
m_nRecvOut = 0;
m_hKillThreadEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
m_hThreadKilledEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
::InitializeCriticalSection(&m_csSend);
::InitializeCriticalSection(&m_csRecv);
// 啟動子線程
::AfxBeginThread(SmThread, this, 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++;
if(m_nSendIn >= MAX_SM_SEND) m_nSendIn = 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++;
if(m_nSendOut >= MAX_SM_SEND) m_nSendOut = 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++;
if(m_nRecvIn >= MAX_SM_RECV) m_nRecvIn = 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++;
if(m_nRecvOut >= MAX_SM_RECV) m_nRecvOut = 0;
fSuccess = TRUE;
}
::LeaveCriticalSection(&m_csRecv);
return fSuccess;
}
UINT CSmsTraffic::SmThread(LPVOID lParam)
{
CSmsTraffic* p=(CSmsTraffic *)lParam; // this
int nMsg; // 收到短消息條數
int nDelete; // 目前正在刪除的短消息編號
int i;
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);
nState = stGetSendMessage;
break;
case stGetSendMessage:
if(p->GetSendMessage(&SmParam[0])) nState = stDoSendMessage;
else nState = stDoRecvMessage;
break;
case stDoSendMessage:
if(::gsmSendMessage(&SmParam[0])) nState = stDoRecvMessage;
else nState = stSendWaitIdle;
break;
case stSendWaitIdle:
::Sleep(1000);
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)) nDelete++;
else nState = stDeleteWaitIdle;
}
else nState = stHaveRest;
break;
case stDeleteWaitIdle:
::Sleep(1000);
nState = stDeleteMessage;
break;
}
// 檢測是否有關閉本線程的信號
DWORD dwEvent = ::WaitForSingleObject(p->m_hKillThreadEvent, 20);
if(dwEvent == WAIT_OBJECT_0) nState = stExit;
}
// 置該線程結束標志
::SetEvent(p->m_hThreadKilledEvent);
return 9999;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -