/* * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authors: zhangjiaping * */ #include "search-result-manager.h" using namespace UkuiSearch; SearchResultManager::SearchResultManager(const QString& plugin_id, QObject *parent) : QObject(parent) { m_pluginId = plugin_id; m_resultQueue = new DataQueue; m_getResultThread = new ReceiveResultThread(m_resultQueue, this); initConnections(); } void SearchResultManager::startSearch(const QString &keyword) { qDebug()<isRunning()) { m_getResultThread->start(); } m_resultQueue->clear(); SearchPluginIface *plugin = SearchPluginManager::getInstance()->getPlugin(m_pluginId); plugin->KeywordSearch(keyword, m_resultQueue); } /** * @brief SearchResultManager::stopSearch 停止搜索,开始一次新搜索前或主界面退出时执行 */ void SearchResultManager::stopSearch() { if(m_getResultThread->isRunning()) { m_getResultThread->stop(); SearchPluginIface *plugin = SearchPluginManager::getInstance()->getPlugin(m_pluginId); plugin->stopSearch(); qDebug() << m_pluginId << "stopped"; } } void SearchResultManager::initConnections() { connect(m_getResultThread, &ReceiveResultThread::gotResultInfo, this, &SearchResultManager::gotResultInfo); } ReceiveResultThread::ReceiveResultThread(DataQueue * resultQueue, QObject *parent): QThread(parent) { m_resultQueue = resultQueue; } void ReceiveResultThread::stop() { this->requestInterruption(); this->wait(); } void ReceiveResultThread::run() { QTimer *timer = new QTimer; timer->setInterval(3000); while(!isInterruptionRequested()) { SearchPluginIface::ResultInfo oneResult = m_resultQueue->tryDequeue(); if(oneResult.name.isEmpty()) { if(!timer->isActive()) { timer->start(); } msleep(100); } else { timer->stop(); Q_EMIT gotResultInfo(oneResult); } if(timer->isActive() && timer->remainingTime() < 0.01 && m_resultQueue->isEmpty()) { this->requestInterruption(); } } delete m_timer; }