class ExtractorThread : public QThread{ Q_OBJECT public: ExtractorThread( QObject *parent = 0 ); ~ExtractorThread(); // запускает операцию void extractData( vectorData* inLayer, vectorData* outLayer, double* transform ); // для отмены операции void stop(); signals: void pointProcessed(); // посылается на каждой итерации для отображения прогресса void extractionFinished(); // посылается при успешном завершениии void extractionInterrupted(); // посылается, если выполнение прервано пользователем protected: void run(); private: bool mStop; bool mStart; QMutex mMutex; QWaitCondition mCondition; double* mTransform; vectorData* mInputData; vectorData* mOutputData;}
ExtractorThread::ExtractorThread( QWidget* parent = 0 ) : QThread( parent ), mStop( false ), mStart( false ){}ExtractorThread::~ExtractorThread(){ mMutex.lock(); mStop = true; mCondition.wakeOne(); mMutex.unlock(); wait();}ExtractorThread::extractData( vectorData* inLayer, vectorData* outLayer, double* transform ){ QMutexLocker locker( &mMutex ); mInputData = inLayer; mOutputData = outLayer; mTransform = transform; if ( !isRunning() ) { start(); } else { mStart = true; mCondition.wakeOne(); }}ExtractorThread::stop(){ mMutex.lock(); mStop = true; mMutex.unlock(); wait();}ExtractorThread::run(){ mMutex.lock(); mStop = false; mMutex.unlock(); // продготовка, объявление и инициализация локальны переменных ..... bool s = false; bool interrupted = false; // основной цикл while ( mInputData->next() ) { // выполняем обработку ..... emit( pointProcessed() ); // если пользователь решил прервать операцию mMutex.lock(); s = mStop; mMutex.unlock(); if ( s ) { interrupted = true; break; } } if ( !interrupted ) { emit( extractionFinished() ); } else { emit( extractionInterrupted() ); } mMutex.lock(); if ( !mStart ) { mCondition.wait( &mMutex ); } restart = false; mMutex.unlock();}
ExtractorThread *myThread = new ExtractorThread();
myThread->moveToThread(myThread);
class ExtractorThread : public QThread{ Q_OBJECT public: ExtractorThread( QObject *parent = 0 ); ~ExtractorThread(); public slots: // запускает операцию void extractData( vectorData* inLayer, vectorData* outLayer, double* transform ); // для отмены операции void stop();
vectorProvider* provider = outLayer->provider(); QList<Blocks> data; provider->addData( data );
public slots: // запускает операцию void extractData( vectorData* inLayer, vectorData* outLayer, double* transform ); // для отмены операции void stop();