亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? taskedport.cpp

?? 串口程序可以免費使用,希望大家喜歡,
?? CPP
字號:
// TaskedPort.cpp: implementation of the CTaskedPort class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TaskedPort.h"
#include "Logger.h"
#include "Stringtokenizer.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTaskedPort::CTaskedPort()
{
}

CTaskedPort::~CTaskedPort()
{
	if(m_pFGTask)
	{
		m_pFGTask->AbortTask();
		m_pFGTask = NULL;
	}
	
	if(m_pBGTask)
	{
		m_pBGTask->AbortTask();
		m_pBGTask = NULL;
	}
	
}

void CTaskedPort::OnEvRxChar()
{
	CSingleLock sl(&m_Mutex);
	sl.Lock();
	//接收字符
	
	CString sInput;
	sInput = ReadAll();
	TRACE("\r\nreceived<<%s\r\n", sInput);
	TRACE("\r\n當前TASK %s...\r\n", m_pFGTask ? m_pFGTask->m_sTaskName : "<無>");
	TRACE("m_pFGTask == %p\r\n", m_pFGTask);
	
	//優先處理前臺任務
	if(m_pFGTask)
	{
		TRACE("\r\n處理TASK %s...\r\n", m_pFGTask->m_sTaskName);
		if(m_pFGTask->Catch(sInput) != -1)
		{
			//控制權轉交后臺任務
			m_pFGTask = NULL;
			
			if(m_pBGTask)
				m_pBGTask->ResetTask();
		}
		return;
	}
	
	//處理后臺任務
	if(m_pBGTask)
	{
		if(m_pBGTask->Catch(sInput) != -1)
		{
			//繼續新任務
			m_pBGTask->ResetTask();
		}
	}
}

CPortTask::CPortTask(CString sTaskName)
{
	m_hCompleteEvent = NULL;
	m_pOwner = NULL;
	m_pOwnerPort = NULL;
	m_nLimit = 0xFFFF;
	m_sTaskName = sTaskName;

	ResetTask();
}

CPortTask::~CPortTask()
{
	EndTask();
}

BOOL CTaskedPort::Open(CString sPort)
{
	if(!CSerialPort::Open(sPort))
		return FALSE;
	
	StartListener();
	return TRUE;
}

void CTaskedPort::UnloadTask(CPortTask *pTask)
{
	CSingleLock sl(&m_Mutex);
	sl.Lock();
	
	if(pTask == m_pFGTask)
		m_pFGTask = NULL;
	
	if(pTask == m_pBGTask)
		m_pBGTask = NULL;
}

int CPortTask::AddMatch(CString sMatch, int nValue)
{
	m_sMatches.Add(sMatch);
	int nWhich = m_nMatchCodes.Add(nValue);
	
	return nWhich;
}

int CPortTask::AddMatch(CString sMatch)
{
	return AddMatch(sMatch, m_nMatchCodes.GetSize());
}

int CPortTask::AddMatches(CString sMatches)
{
	CStringTokenizer st(sMatches, "|");
	CStringArray * psa = st.GetTokens();
	int nCount = 0;
	
	for(int i = 0; i < psa->GetSize(); i++)
	{
		if(AddMatch(psa->GetAt(i)))
			nCount++;
	}
	
	return nCount;
}

DWORD CTaskedPort::SendCommand(CString sCommand, DWORD nIdleTimeLimit)
{
	//ASSERT(sCommand.Right(1) == "\r" || sCommand.Right(1) == 26);
	TRACE("\r\nsend>>" + sCommand + "\r\n");

	::Logger.Log("發送命令>>%s", sCommand);

	return Write(sCommand, nIdleTimeLimit);
}

int CTaskedPort::Request(CString sRequest, CString & sResponse, int nEndCondition, CWaiting * pWaiting, char * sFind, CString sTaskName, DWORD nIdleTimeLimit)
{
	AssertConnected();
	Purge(PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

	///////////////////////////////
	////構造TASK
	//////////////////////////////

	if(sTaskName.IsEmpty())
		sTaskName = sRequest;

	CPortTask Task(sTaskName);
	
	if(nEndCondition & ecOkOrError)
		Task.AddMatches("ERROR|OK");
	
	if(nEndCondition & ecCrlf)
		Task.AddMatch("\r");
	
	if(sFind)
		Task.AddMatches(sFind);
	
	//設置停止標志
	if(Task.GetMatches()->GetSize())
		nEndCondition |= ecWaiting;
	else
		nEndCondition &= ~ecWaiting;
	
	if(nEndCondition & ecDirty)
		nEndCondition |= ecWaiting;
	
	///////////////////////////////
	////載入TASK
	//////////////////////////////

	LoadFGTask(&Task);

	//發送命令
	if(SendCommand(sRequest, nIdleTimeLimit) <= 0)
	{
		return -1;
	}

	WaitForTask(&Task, nEndCondition, pWaiting, nIdleTimeLimit);

	sResponse = Task.GetInputBuffer();
	::Logger.Log("接收數據<<%s", sResponse);

	return Task.GetMatchCode();
}

CString CTaskedPort::Request(CString sRequest, int nEndCondition, CWaiting * pWaiting, char * sFind, CString sTaskName, DWORD nIdleTimeLimit)
{
	CString sResponse;
	Request(sRequest, sResponse, nEndCondition, pWaiting, sFind, sTaskName, nIdleTimeLimit);
	
	return sResponse;
}

void CTaskedPort::LoadBGTask(CPortTask *pTask)
{
	CSingleLock sl(&m_Mutex);
	sl.Lock();
	
	if(m_pBGTask)
	{
		TRACE("舊任務:%s\r\n", m_pBGTask->m_sTaskName);
		TRACE("新任務:%s\r\n", pTask->m_sTaskName);
		
		m_pBGTask->AbortTask();
	}
	
	m_pBGTask = pTask;
	
	if(pTask)
	{
		pTask->SetOwner(this);
		pTask->ResetTask();
	}
}

void CTaskedPort::LoadFGTask(CPortTask *pTask)
{
	CSingleLock sl(&m_Mutex);
	sl.Lock();
	
	if(m_pFGTask)
	{
		TRACE("舊任務:%s\r\n", m_pFGTask->m_sTaskName);
		TRACE("新任務:%s\r\n", pTask->m_sTaskName);

		::Logger.Log("警告:舊任務[%s]與新任務[%s] 發生沖突!", 
			m_pFGTask->m_sTaskName, 
			pTask->m_sTaskName);
		
		m_pFGTask->AbortTask();
	}
	
	m_pFGTask = pTask;
	TRACE("設置前臺TASK: %s\r\n", pTask->m_sTaskName);
	TRACE("m_pFGTask == %p\r\n", m_pFGTask);
	
	if(pTask)
	{
		pTask->SetOwner(this);
		pTask->ResetTask();
	}
}

void CPortTask::OnTaskCompleted()
{
	//do nothing...
}

BOOL CPortTask::IsCompleted()
{
	CSingleLock sl(&m_Mutex);
	sl.Lock();

	return m_bCompleted;
}

void CPortTask::ResetTask()
{
	m_bCompleted = FALSE;
	m_sFullInput.Empty();
	
	if(m_hCompleteEvent)
		::ResetEvent(m_hCompleteEvent);
	
	m_nMatchIndex = -1;
	m_nDirty = 0;
	
}

int CPortTask::Catch(CString sInput)
{
	TRACE("Catch %s\r\n", sInput);

	CSingleLock sl(&m_Mutex);
	sl.Lock();

	m_nDirty++;

	if(m_nDirty >= 0x8000)
	{
		m_nDirty = 0;
	}
	
	CString sLastInput = m_sFullInput;
	m_sFullInput += sInput;
	
	//扔掉舊信息
	if(m_nLimit > 0 && m_sFullInput.GetLength() > m_nLimit)
	{
		m_sFullInput.Delete(0, m_sFullInput.GetLength() - m_nLimit);
	}
	
	for(int i = 0; i < m_sMatches.GetSize(); i++)
	{
		//查找指定的字符串
		CString sMatch = m_sMatches.GetAt(i);
		CString sCatch = sLastInput.Right(sMatch.GetLength()) + sInput;
		
		//找到匹配
		if(sCatch.Find(sMatch) != -1)
		{
			{
				m_nMatchIndex = i;
				break;;
			}
		}
	}
	
	//返回匹配碼
	int nCode = GetMatchCode();
	if(nCode != -1)
	{
		CompleteTask();
	}
	
	return nCode;
}

void CPortTask::AttachEvent(HANDLE hEvent)
{
	m_hCompleteEvent = hEvent;
}

void CPortTask::AttachEvent(CWnd *pOwner, UINT nMessageID)
{
	m_pOwner = pOwner;
	m_nNotifyMessageID = nMessageID;
}

int CPortTask::GetMatchCode()
{
	if(!m_sMatches.GetSize())
		return 0;
	
	if(m_nMatchIndex == -1)
		return -1;
	
	return m_nMatchCodes.GetAt(m_nMatchIndex);
}

void CPortTask::CompleteTask()
{
	TRACE("TASK completed!\r\n");
	m_bCompleted = TRUE;
	OnTaskCompleted();
	
	//以下語句必須放在最后,以防止CPortTask析構提前產生
	if(m_pOwner)
	{
		m_pOwner->PostMessage(m_nNotifyMessageID, (WPARAM)this, (LPARAM)GetMatchCode());
	}
	
	if(m_hCompleteEvent)
	{
		::SetEvent(m_hCompleteEvent);
	}	
}

void CPortTask::SetOwner(CTaskedPort *pOwnerPort)
{
	m_pOwnerPort = pOwnerPort;
}

void CPortTask::EndTask()
{
	if(m_pOwnerPort)
	{
		m_pOwnerPort->UnloadTask(this);
	}
}

void CPortTask::AbortTask()
{
	EndTask();
}

void CPortTask::SetBufferSize(int nLimit)
{
	m_nLimit = nLimit;
}

int CPortTask::GetDirty()
{
	return m_nDirty;
}

CString CPortTask::GetInputBuffer()
{
	return m_sFullInput;
}

CStringArray * CPortTask::GetMatches()
{
	return &m_sMatches;
}

void CTaskedPort::Close()
{
	UnloadTask(m_pBGTask);
	UnloadTask(m_pFGTask);

	CSerialPort::Close();
}

void CTaskedPort::WaitForTask(CPortTask *pTask, int nEndCondition, CWaiting * pWaiting, DWORD nIdleTimeLimit)
{
	int nDirty = 0;
	DWORD nStartTime = GetTickCount();
	
	while(!pTask->IsCompleted())
	{
		AssertConnected();

		//不需要等待
		if(!(nEndCondition & ecWaiting))
			break;
		
		//有數據
		int nNewDirty = pTask->GetDirty();
		if(nDirty != nNewDirty)
		{
			nDirty = nNewDirty;
			nStartTime = GetTickCount();
			
			//顯示進度
			pWaiting->OnWaitChip(true);
			
			//有臟數據即返回
			if(nEndCondition & ecDirty)
				break;
		}

		//沒有數據
		else
		{
			pWaiting->OnWaitChip(false);
			
			//是否有時限?
			if(nIdleTimeLimit != -1)
			{
				DWORD nEndTime = GetTickCount();
				
				//超時
				if(nEndTime - nStartTime > nIdleTimeLimit)
				{
					//提示是否繼續等待
					if(nEndCondition & ecRetryPrompt)
					{
						if(::MessageBox(NULL, "數據等待時間過長,是否繼續等待?", 
							"等待超時", 
							MB_YESNO | MB_ICONQUESTION) == IDNO)
						{
							throw new CTimeoutException();
						}
						//繼續等待
						else
						{
							continue;
						}
					}
					
					//不允許超時
					if(!(nEndCondition & ecRetryAlways))
					{
						::Logger.Log("等待超時錯誤!");
						throw new CTimeoutException();
					}
				} // if(nEndTime - nStartTime > nIdleTimeLimit)
			} //if(nIdleTimeLimit != -1)
		} //if(nDirty == nNewDirty)
	} //while
	
	pWaiting->OnWaitChip(true);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品日韩一区二区三区| 成人精品一区二区三区四区| 欧美日韩国产一级| 一级精品视频在线观看宜春院| 色噜噜久久综合| 亚洲一区二区三区四区的| 欧美唯美清纯偷拍| 日本vs亚洲vs韩国一区三区二区| 日韩免费成人网| 国产精品一二二区| 国产精品久久久久久久第一福利 | 国产精品美日韩| 成人av第一页| 一区二区三区电影在线播| 欧美日韩国产美女| 国产精品亚洲人在线观看| 亚洲男人的天堂网| 91精品在线一区二区| 高清不卡一区二区| 香蕉av福利精品导航| 久久这里都是精品| 在线中文字幕一区| 麻豆精品视频在线| 最新不卡av在线| 欧美哺乳videos| 色婷婷久久综合| 蜜桃av一区二区| 亚洲美女电影在线| 精品欧美一区二区久久| 色婷婷精品久久二区二区蜜臀av | 911国产精品| 成人看片黄a免费看在线| 丝袜国产日韩另类美女| 欧美激情中文字幕| 欧美一区日本一区韩国一区| 成人av影视在线观看| 蜜桃在线一区二区三区| 亚洲乱码国产乱码精品精98午夜 | 国产精品影视在线观看| 亚洲成av人在线观看| 欧美经典一区二区| 欧美一区二区网站| 欧美在线观看你懂的| 国产高清精品久久久久| 日韩精品视频网站| 亚洲欧美另类久久久精品2019| 精品少妇一区二区| 911国产精品| 欧美午夜精品久久久| 北条麻妃一区二区三区| 国产精品乡下勾搭老头1| 日日摸夜夜添夜夜添国产精品| ...xxx性欧美| 国产精品久久国产精麻豆99网站| 欧美电视剧在线观看完整版| 欧美美女激情18p| 色噜噜狠狠色综合中国| 99久久精品免费看国产免费软件| 国产综合成人久久大片91| 天天亚洲美女在线视频| 亚洲一区在线看| 亚洲人成网站精品片在线观看| 国产精品污污网站在线观看| 久久伊99综合婷婷久久伊| 精品国产制服丝袜高跟| 日韩欧美亚洲国产另类| 欧美一区二区三区喷汁尤物| 欧美日韩1区2区| 欧美日本乱大交xxxxx| 欧美视频中文字幕| 欧美午夜一区二区| 欧美丰满少妇xxxxx高潮对白| 欧美日韩精品一区二区三区蜜桃| 欧美天天综合网| 欧美电影一区二区| 8v天堂国产在线一区二区| 欧美精品免费视频| 欧美一区午夜精品| 精品国产乱码久久久久久牛牛| 日韩精品一区二区三区蜜臀 | 在线91免费看| 日韩欧美国产一区二区三区 | 久久精品无码一区二区三区| 久久久久久久免费视频了| 久久久久久97三级| 国产精品久99| 亚洲国产日韩a在线播放| 天天免费综合色| 麻豆精品新av中文字幕| 国产精品亚洲综合一区在线观看| 懂色一区二区三区免费观看| caoporen国产精品视频| 日本乱人伦aⅴ精品| 欧美人与性动xxxx| 日韩欧美亚洲国产另类| 欧美激情艳妇裸体舞| 亚洲区小说区图片区qvod| 夜夜嗨av一区二区三区中文字幕| 亚洲国产精品久久人人爱| 三级不卡在线观看| 国产乱妇无码大片在线观看| www.欧美日韩| 欧美军同video69gay| 日韩久久免费av| 国产精品久久免费看| 一个色综合av| 国产在线精品视频| 色八戒一区二区三区| 欧美一级片在线| 中文av一区特黄| 偷拍一区二区三区四区| 国产福利一区二区| 欧美怡红院视频| 久久久久久亚洲综合影院红桃 | 亚洲福利国产精品| 国产精品99久久不卡二区| 日本精品视频一区二区三区| 精品久久人人做人人爱| 亚洲欧美二区三区| 精品中文字幕一区二区小辣椒| av电影在线观看不卡| 日韩欧美aaaaaa| 亚洲精品一二三| 国产精品一区二区在线看| 欧美三片在线视频观看| 久久久精品tv| 免费成人在线视频观看| 91色九色蝌蚪| 精品日韩在线一区| 亚洲电影一级黄| 大白屁股一区二区视频| 日韩精品在线一区二区| 亚洲女爱视频在线| 国产不卡视频在线播放| 欧美一区二区在线免费观看| 亚洲精品五月天| 岛国精品在线播放| 日韩精品一区二区三区在线观看| 亚洲图片自拍偷拍| 成人午夜av在线| 欧美xxxxxxxx| 日本成人中文字幕在线视频| 91福利国产精品| 亚洲男人的天堂网| 成人a区在线观看| 久久综合网色—综合色88| 午夜精品久久久久影视| 在线观看国产日韩| 亚洲欧美另类图片小说| 99视频精品在线| 欧美国产日韩一二三区| 国产一区二区久久| 久久综合九色综合97婷婷| 人妖欧美一区二区| 欧美一级一级性生活免费录像| 亚洲成av人片| 欧美日韩二区三区| 亚洲aaa精品| 欧美老肥妇做.爰bbww| 午夜视频在线观看一区二区三区| 色激情天天射综合网| 亚洲精选视频在线| 欧洲一区二区av| 偷窥国产亚洲免费视频| 欧美色图在线观看| 亚洲成人av一区二区三区| 欧美色视频在线| 日韩成人dvd| www激情久久| 粉嫩蜜臀av国产精品网站| 国产欧美日韩麻豆91| 成人免费观看av| 亚洲欧美日韩一区二区三区在线观看| 99久久久久久| 亚洲国产精品久久久久婷婷884| 欧美日韩不卡视频| 精品亚洲免费视频| 国产农村妇女毛片精品久久麻豆 | 欧美成人乱码一区二区三区| 久99久精品视频免费观看| 欧美精品一区视频| 国产99久久久国产精品免费看| 日本一区二区三区高清不卡| 91小视频免费看| 午夜一区二区三区视频| 日韩美女一区二区三区| 国产99精品视频| 亚洲精品国产成人久久av盗摄 | 成人理论电影网| 亚洲一区二区三区不卡国产欧美| 欧美疯狂性受xxxxx喷水图片| 精品一二线国产| 亚洲色图一区二区三区| 欧美高清视频在线高清观看mv色露露十八 | 成人a区在线观看| 亚洲动漫第一页| 久久婷婷国产综合国色天香| 91影院在线观看| 欧美aⅴ一区二区三区视频| 国产视频一区二区在线观看|