UINT CHeartbeatThread::HeartbeatThreadFunction(LPVOID pParam) { pParent = static_cast<CHeartbeatThread*>(pParam); // Seed the RNG srand((unsigned)GetTickCount()); while (true) { _heartbeat_counter++; write_log(preferences.debug_heartbeat(), "[HeartBeatThread] Starting next cycle\n"); // Check event for stop thread if(::WaitForSingleObject(pParent->_m_stop_thread, 0) == WAIT_OBJECT_0) { // Set event ::SetEvent(pParent->_m_wait_thread); AfxEndThread(0); } LogMemoryUsage("Begin of heartbeat thread cycle"); p_tablemap_loader->ReloadAllTablemapsIfChanged(); if (p_autoconnector->IsConnected()) { if (IsWindow(p_autoconnector->attached_hwnd())) { ScrapeEvaluateAct(); } else { // Table disappeared p_autoplayer->EngageAutoplayer(false); p_autoconnector->Disconnect(); } } else { // Not connected AutoConnect(); } FlexibleHeartbeatSleeping(); write_log(preferences.debug_heartbeat(), "[HeartBeatThread] Heartbeat cycle ended\n"); } }
UINT CHeartbeatThread::HeartbeatThreadFunction(LPVOID pParam) { CTablepointChecker tablepoint_checker; pParent = static_cast<CHeartbeatThread*>(pParam); assert(pParent != NULL); // Seed the RNG srand((unsigned)GetTickCount()); while (true) { _heartbeat_counter++; write_log(Preferences()->debug_heartbeat(), "[HeartBeatThread] Starting next cycle\n"); // Check event for stop thread if(::WaitForSingleObject(pParent->_m_stop_thread, 0) == WAIT_OBJECT_0) { // Set event write_log(Preferences()->debug_heartbeat(), "[HeartBeatThread] Ending heartbeat thread\n"); LogMemoryUsage("Hc"); ::SetEvent(pParent->_m_wait_thread); AfxEndThread(0); } assert(p_tablemap_loader != NULL); LogMemoryUsage("H1"); p_tablemap_loader->ReloadAllTablemapsIfChanged(); LogMemoryUsage("H2"); assert(p_autoconnector != NULL); write_log(Preferences()->debug_alltherest(), "[CHeartbeatThread] location Johnny_B\n"); if (p_autoconnector->IsConnectedToGoneWindow()) { LogMemoryUsage("H3"); p_autoconnector->Disconnect("table disappeared"); } LogMemoryUsage("H4"); if (!p_autoconnector->IsConnectedToAnything()) { // Not connected AutoConnect(); } // No "else" here // We want one fast scrape immediately after connection // without any heartbeat-sleeping. LogMemoryUsage("H5"); write_log(Preferences()->debug_alltherest(), "[CHeartbeatThread] location Johnny_C\n"); if (p_autoconnector->IsConnectedToExistingWindow()) { if (tablepoint_checker.TablepointsMismatchedTheLastNHeartbeats()) { LogMemoryUsage("H6"); p_autoconnector->Disconnect("table theme changed (tablepoints)"); } else { LogMemoryUsage("H7"); ScrapeEvaluateAct(); } } assert(p_watchdog != NULL); LogMemoryUsage("H8"); p_watchdog->HandleCrashedAndFrozenProcesses(); if (Preferences()->use_auto_starter()) { LogMemoryUsage("H9"); _openholdem_starter.StartNewInstanceIfNeeded(); } LogMemoryUsage("Ha"); if (Preferences()->use_auto_shutdown()) { _openholdem_starter.CloseThisInstanceIfNoLongerNeeded(); } LogMemoryUsage("Hb"); _heartbeat_delay.FlexibleSleep(); write_log(Preferences()->debug_heartbeat(), "[HeartBeatThread] Heartbeat cycle ended\n"); LogMemoryUsage("End of heartbeat cycle"); } }