Exemple #1
0
/// Thread function that dispatches queued message blocks to the AOIA application.
void WorkerThreadMethod(void*)
{
    while ((g_hEvent != NULL) && (WaitForSingleObject(g_hEvent,INFINITE) == WAIT_OBJECT_0))
    {
        if (g_hEvent == NULL) {
            break;
        }

        DWORD tick = GetTickCount();
        if (tick < g_lastThreadTick) {
            // Overflow
            g_lastThreadTick = tick;
        }

        if ((tick - g_lastThreadTick > 10000) || (g_targetWnd == NULL)) {
            // We either don't have a valid window target OR it has been more than 10 sec since we last update the target.
            g_targetWnd  = FindWindow ( "ItemAssistantWindowClass", NULL ); // TODO: make the class name a list in registry
            g_lastThreadTick = GetTickCount();
            LOG("FindWindow returned: " << g_targetWnd);
        }

        while (!g_dataQueue.empty())
        {
            DataItemPtr item = g_dataQueue.pop();

            if (g_targetWnd == NULL) {
                // We have data, but no target window, so just delete the message
                continue;
            }

            COPYDATASTRUCT data;
            data.dwData = item->type();
            data.lpData = item->data();
            data.cbData = item->size();

            // To avoid blocking the main thread, we should not have a lock on the queue while we process the message.
			SendMessage( g_targetWnd, WM_COPYDATA, 0, ( LPARAM ) &data );
            LOG("After SendMessage error code is " << GetLastError());
        }
    }
}
void* TcpClient::responseFunc(TcpClient* arg)
{
	TcpClient* pClient = (TcpClient*)arg;
	DataQueue recvDataQueue;
	int nDataLen(-1);
	while (!pClient->m_bStop)
	{
		char recvBuf[65535];
		int nLen(pClient->getSocket()->recv(recvBuf, sizeof(recvBuf) / sizeof(char), 0));
		if (nLen < 0)
		{

		}
		else
		{
			recvDataQueue.push(recvBuf, nLen);
			int nPos(0);
			int nPackage(recvDataQueue.getPos());

			while (1)
			{
				if (nPackage <= 0)
					break;

				CodedInputStream* coded_input = new CodedInputStream((uint8_t*)(recvDataQueue.getBuf() + nPos), recvDataQueue.getPos() - nPos);
				autoptr<CodedInputStream> inputguard(coded_input);

				int nOldPos = coded_input->CurrentPosition();

				uint32_t datalen;
				if (!coded_input->ReadVarint32(&datalen))
				{
					if (nPos > 0)
					{
						recvDataQueue.pop(nPos);
					}
					break;
				}

				int nNewPos = coded_input->CurrentPosition();
				if (nNewPos + datalen > nPackage)
				{
					//一个包没有收整
					if (nPos > 0)
					{
						recvDataQueue.pop(nPos);
					}

					break;
				}
				else if (nNewPos + datalen == nPackage)
				{
					char* data = new char[datalen];
					autoptr_arr<char> arrdata(data);
					if (coded_input->ReadRaw(data, datalen))
					{
						OnPackage(data, datalen);
					}

					recvDataQueue.setPos(0);
					break;
				}
				else
				{
					char* data = new char[datalen];
					autoptr_arr<char> arrdata(data);

					if (coded_input->ReadRaw(data, datalen))
					{
						OnPackage(data, datalen);
					}

					nPackage -= (datalen+nNewPos-nOldPos);
					nPos += (datalen+nNewPos-nOldPos);
				}
			}
		}
	}

	return NULL;
}