VirtausApplication::VirtausApplication (int & argc, char ** argv) : QApplication(argc, argv) { this->reader = new Virtaus::Core::DataReader; this->loaded_data = new QList<Virtaus::Core::Collection*>; this->c_collection = NULL; this->settings = Virtaus::Core::Settings::getInstance(); this->settings->setFile(this->applicationDirPath().append("/config.ini")); this->monitor = new QFileSystemWatcher(this); this->monitor->addPath(QDir::homePath()+"/"+tr("My Collections")); QObject::connect(monitor, SIGNAL(directoryChanged(QString)), this, SLOT(fsUpdate(QString))); QObject::connect(this, SIGNAL(aboutToQuit()), this, SLOT(safeQuit())); }
void EventHandler::run() { //status_ = NORMAL; //eq_->pushSaveData(nid_, 1, -1, clock_->refreshNow()+30*1000, 0); //long interval = gameConfig.gamed_heartBeatInterval(nid_); long interval = 20; // 20ms #ifdef _WIN32 int dummyfd = socket(PF_INET, SOCK_STREAM, 0); fd_set dummyread; FD_ZERO(&dummyread); TIMEVAL timeout; #else timeval timeout; #endif timeout.tv_sec = 0; timeout.tv_usec = interval * 1000; vector<Event*> events; events.reserve(40960); last_check_wait_event_ = Clock::getCurrentSystemTime(); TicTac timer; TicTac event_watch; while (true) { if(nh_ == NULL) { usleep(100); continue; } timer.tic(); reversion_ = Clock::getCurrentSystemTime(); if(dh_ != NULL) { dh_->setRevision(reversion_); } CHG_LOG_FILE(); #ifndef _WIN32 int ntime = reversion_; if (reversion_ - m_lstEventTime>60000) { m_xEventCounter.WriteFirstLine(ntime); m_lstEventTime = reversion_; } #endif acquireEventLock(); for (size_t i=0; i<events.size(); i++) { events[i]->Clear(); eq_->freeEvent(events[i]); } events.clear(); if (status_!=NORMAL) { while (!eq_->isEmpty() && 0 > eq_->topTime()) { events.push_back(eq_->popEvent()); } } else { while (!eq_->isEmpty() && reversion_ >= eq_->topTime()) { events.push_back(eq_->popEvent()); } } releaseEventLock(); if (!urgent_saving_flag_) { tick(); if(last_check_wait_event_ < reversion_ - 300 && !wait_event_list_.empty()) { events.insert(events.end(), wait_event_list_.begin(), wait_event_list_.end()); wait_event_list_.clear(); last_check_wait_event_ = reversion_; } event_watch.tic(); for (size_t i=0; i<events.size(); i++) { acquireDataLock(); dispatchEvent(events[i]); releaseDataLock(); event_pf_->hitEvent(events[i]->cmd(), (double)event_watch.tac()); } } else { printf("safeQuit before\n"); acquireDataLock(); safeQuit(); releaseDataLock(); printf("safeQuit after\n"); dh_->termThreads(); printf("termThreads\n"); CSysLog::GetInstance()->Quit(); printf("CSysLog\n"); nh_->quit(); printf("net quit\n"); break; } stat_->capture("event.num", (float)events.size()); int elapsed = (int)timer.tac(); stat_->capture("event.process-time", (float)elapsed); stat_->capture("user.online", (float)counter_->count("user.online")); if (elapsed>=interval) { if (elapsed>=10*interval) LOG4CXX_WARN(logger_, "Heart beat overload, used "<<elapsed<<" ms. (interval:"<<interval<<" ms)"); continue; } timeout.tv_usec = (interval - elapsed) * 1000; #ifdef _WIN32 FD_SET(dummyfd, &dummyread); int r; if ((r=select(dummyfd+1, &dummyread, NULL, NULL, &timeout))<0) { int err = WSAGetLastError(); LOG4CXX_ERROR(logger_, "select failed in thread, return value:"<<r<<" error no:"<<err); } #else int r; if ((r=select(1, NULL, NULL, NULL, &timeout))<0) { LOG4CXX_ERROR(logger_, "select failed in thread, return value:"<<r); } #endif } exit(0); }