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()));
}
Exemple #2
0
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);
}