C++ (Qt)#include "CFileFindThread.h"///////////потокCFileFindThread::CFileFindThread( QObject*parent /*=0*/ ) :QThread(parent){ m_FilterNames.clear(); m_FilesList.clear(); m_Path.clear(); } CFileFindThread::CFileFindThread( QString path, QStringList fiterNames, QObject* parent/*=0*/ ) :QThread(parent){ m_Path = path; m_FilterNames =fiterNames;} QStringList CFileFindThread::getListFilesFind( const QString &pathr, QStringList filters ){ // m_processError = ETE_WAITFORMINGFILELIST; // QString path; if(pathr.isEmpty()) path = QDir::currentPath(); else path = pathr; QDir dir(path); if(!dir.exists()) { // emit isErrorDir(true); // // return QStringList(); } QStringList listFiles = QStringList(); foreach (QString file, dir.entryList(filters)) { listFiles << QFileInfo(dir, file).absoluteFilePath(); } int current=0; int all = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot).count(); foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { listFiles << getListFilesFind(path + QDir::separator() + subDir, filters); current ++; emit currentProgress(current *100 / all); } return listFiles;} void CFileFindThread::run(){ QDir dir(m_Path); m_FilesList = getListFilesFind(m_Path,m_FilterNames); emit finished(m_FilesList); exec(); } //////////////////////используюvoid startFind(){ ui.listWidget->clear(); if(!m_threadFileFind) m_threadFileFind = new CFileFindThread(m_Path, m_FilterNames, this); connect(m_threadFileFind, SIGNAL(finished(QStringList)), this, SLOT(setFilesList(QStringList))); connect(m_threadFileFind,SIGNAL(currentProgress(int)),this,SLOT(setProgress(int))); connect(ui.pushButtonCancel, SIGNAL(clicked()),this ,SLOT(stopFind())); m_threadFileFind->start(); } public slots: void setFilesList(QStringList val) { m_FilesList = val; bool select = true; for(int i=0; i<val.count();i++) { QListWidgetItem * tempItem = new QListWidgetItem(val[i], ui.listWidget); tempItem->setCheckState(Qt::CheckState(2*select)); } m_isChangedContent = true; ui.groupBox_2->setVisible(true); delete m_threadFileFind; m_threadFileFind= NULL; emit finished(); } void stopFind() { ui.groupBox->setVisible(false); ui.groupBox_2->setVisible(true); m_threadFileFind->terminate(); delete m_threadFileFind; }
C++ (Qt)void CFileBrowser::startFind(){ if(!m_isRunningFileFindThread) { ui.listWidget->clear(); CFileFindThread * threadFileFind = new CFileFindThread(m_Path, m_FilterNames, this); connect(threadFileFind,SIGNAL(finished(CFileFindThread*)),this,SLOT(deleteThread(CFileFindThread*))); connect(threadFileFind, SIGNAL(finished(QStringList)), this, SLOT(setFilesList(QStringList))); connect(threadFileFind,SIGNAL(currentProgress(int)),this,SLOT(setProgress(int))); connect(ui.pushButtonCancel, SIGNAL(clicked()),threadFileFind ,SLOT(emitStop())); if(!m_isRunningFileFindThread) connect(ui.pushButtonStart, SIGNAL(clicked()), this, SLOT(startFind())); threadFileFind->start(); m_isRunningFileFindThread = true; }} void CFileBrowser::deleteThread( CFileFindThread* val ){ if( val != NULL) { val->terminate(); val->deleteLater(); m_isRunningFileFindThread = false; }} void CFileBrowser::emitCancel(){ if(m_isRunningFileFindThread) { qDebug()<<"auto click cancel"; ui.pushButtonCancel->click(); }} void CFileBrowser::setFilesList( QStringList val ){ m_FilesList = val; bool select = true; for(int i=0; i<val.count();i++) { QListWidgetItem * tempItem = new QListWidgetItem(val[i], ui.listWidget); tempItem->setCheckState(Qt::CheckState(2*select)); } m_isRunningFileFindThread = false; emit finished();} //////////// void CFileFindThread::run(){ qDebug()<<"start"<<this; QDir dir(m_Path); m_FilesList = getListFilesFind(m_Path,m_FilterNames); emit finished(m_FilesList); emit finished(this); this->quit(); exec(); qDebug()<<"end"<<this; }void emitStop(){ emit finished(this);}
C++ (Qt)void CFileBrowser::startFind(){ if(!m_isRunningFileFindThread) { ui.listWidget->clear(); CFileFindThread * threadFileFind = new CFileFindThread(m_Path, m_FilterNames, this); connect(threadFileFind,SIGNAL(finished(CFileFindThread*)),this,SLOT(deleteThread(CFileFindThread*)));///сработает сразу после отработки потока и в случае, когда я сам сгенерирую этот сигнал с помощью кнопки (см ниже) connect(threadFileFind, SIGNAL(finished(QStringList)), this, SLOT(setFilesList(QStringList))); connect(threadFileFind,SIGNAL(currentProgress(int)),this,SLOT(setProgress(int))); connect(ui.pushButtonCancel, SIGNAL(clicked()),threadFileFind ,SLOT(emitStop())); ////////генерация останова для потока if(!m_isRunningFileFindThread) connect(ui.pushButtonStart, SIGNAL(clicked()), this, SLOT(startFind())); threadFileFind->start(); m_isRunningFileFindThread = true; }} void CFileBrowser::deleteThread( CFileFindThread* val )/////только потому, что поток локальный есть сигнально-слотовая связка, где есть указатель на текущий поток{ if( val != NULL) { val->terminate(); val->deleteLater(); m_isRunningFileFindThread = false; }} void CFileBrowser::emitCancel()//знаю, что очень тупо (не знаю как изменить), так останавливаю поток через функцию класса родителя потока, генерирую клик на кнопку, в свою очередь кнопка вызывает метод у потока (emitStop()), который гененирует мой сигнал finished(CFileFindThread*), а из-за него уже вызывается функция deleteThread(...) и поток останавливается и удаляется{ if(m_isRunningFileFindThread) { qDebug()<<"auto click cancel"; ui.pushButtonCancel->click(); }} void CFileBrowser::setFilesList( QStringList val ){ m_FilesList = val; bool select = true; for(int i=0; i<val.count();i++) { QListWidgetItem * tempItem = new QListWidgetItem(val[i], ui.listWidget); tempItem->setCheckState(Qt::CheckState(2*select)); } m_isRunningFileFindThread = false; emit finished();} //////////// void CFileFindThread::run(){ qDebug()<<"start"<<this; QDir dir(m_Path); m_FilesList = getListFilesFind(m_Path,m_FilterNames); emit finished(m_FilesList); emit finished(this); this->quit(); exec(); qDebug()<<"end"<<this; }void emitStop()////вот почему есть свой сигнал finished(), для того, чтобы знать указатель на текущий поток извне{ emit finished(this);}