/// 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; }