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

📄 tswnd.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
字号:
// TSWnd.cpp: implementation of the CTSWnd class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TSWnd.h"
#include "TSCache.h"

#include "tracetool.h"

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

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

CTSWnd & CTSWnd::GetInstance()
{
	static CTSWnd s_wndmsg;
	return s_wndmsg;
}

CTSWnd::CTSWnd()
{
	CTSWnd::GetInstance().StartDispatchThread();
}

CTSWnd::~CTSWnd()
{
}

int CTSWnd::AddWnd(HWND hWnd, UINT nMsg)
{
	CSingleLock	lock(&m_mutex, TRUE);

	TSWND_MSG wndmsg;
	wndmsg.hWnd = hWnd;
	wndmsg.nMsg = nMsg;
	return m_aWndMsg.Add(wndmsg);
}

void CTSWnd::RemoveWnd(HWND hWnd)
{
	CSingleLock	lock(&m_mutex, TRUE);

	for (int i=m_aWndMsg.GetSize()-1; i>=0; i--)
	{
		if (m_aWndMsg.ElementAt(i).hWnd == hWnd)
			m_aWndMsg.RemoveAt(i);
	}
}

void CTSWnd::SendMessage(WPARAM wParam, LPARAM lParam)
{
	CTSWndMsgArray		aWndMsgTemp;

	{
		CSingleLock	lock(&m_mutex, TRUE);
		aWndMsgTemp.SetSize(m_aWndMsg.GetSize());

		for (int i=0; i<m_aWndMsg.GetSize(); i++)	
			aWndMsgTemp.SetAt(i, m_aWndMsg.ElementAt(i));
	}

	for (int i=0; i<aWndMsgTemp.GetSize(); i++)
	{
		::SendMessage(aWndMsgTemp.ElementAt(i).hWnd, aWndMsgTemp.ElementAt(i).nMsg,
					wParam, lParam);
	}
}

BOOL CTSWnd::IsEmpty()
{
	CSingleLock	lock(&m_mutex, TRUE);

	return 0 == m_aWndMsg.GetSize();
}

HANDLE CTSWnd::m_hEventKillDispatchThread	= NULL;
HANDLE CTSWnd::m_hEventDispatchThreadKilled	= NULL;

// 分发数据线程
UINT TSDispatchThreadMain(LPVOID pParam)
{
	while(TRUE)
	{
		UINT nMsgType = 0;
		PRCV_DATA pRCV_DATA = NULL;
		if (CTSCache::GetInstance().PopPacket(nMsgType, pRCV_DATA))
		{
			ASSERT(pRCV_DATA && pRCV_DATA->m_pData);
			if (pRCV_DATA && pRCV_DATA->m_pData)
				CTSWnd::GetInstance().SendMessage(nMsgType, (LPARAM)pRCV_DATA);

			char szText[256];
			sprintf(szText, "↑DataType:%d PacketNum:%d", pRCV_DATA->m_wDataType, pRCV_DATA->m_nPacketNum);
			g_pWinTrace->Debug()->Send("TSDispatchThreadMain", szText);

			CTSCache::GetInstance().FreePacket(pRCV_DATA);
		}

		Sleep(1);

		// User wants to quit program
		if (WAIT_OBJECT_0 == WaitForSingleObject(CTSWnd::m_hEventKillDispatchThread,0))
		{
			SetEvent(CTSWnd::m_hEventDispatchThreadKilled);
			AfxEndThread(0, TRUE);
			return 0;
		}
	}
}

void CTSWnd::StartDispatchThread()
{
	m_hEventKillDispatchThread = CreateEvent(NULL,FALSE,FALSE,NULL);
	m_hEventDispatchThreadKilled = CreateEvent(NULL,FALSE,FALSE,NULL);

	AfxBeginThread(TSDispatchThreadMain, NULL, THREAD_PRIORITY_NORMAL);
}

void CTSWnd::StopDispatchThread()
{
	/* Do not call this function. it does not work well. */
	ASSERT(FALSE);
/*
	// These codes do not work well. system will terminate the thread auto, but cause some memory leaks
	if (m_hEventKillDispatchThread)
		SetEvent(m_hEventKillDispatchThread);

	if (WAIT_OBJECT_0 == WaitForSingleObject(m_hEventKillDispatchThread,2000))
	{
		if (m_hEventKillDispatchThread)
			CloseHandle(m_hEventKillDispatchThread);
		if (m_hEventDispatchThreadKilled)
			CloseHandle(m_hEventDispatchThreadKilled);
		m_hEventKillDispatchThread	=	NULL;
		m_hEventDispatchThreadKilled	=	NULL;
	}
*/
}

⌨️ 快捷键说明

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