C++ (Qt)std::vector<Vertex> ReadVertices( Model * model ){ std::vector<Vertex> dst; size_t count = model->numVertices(); emit someSignal(???); // (стартуем) что здесь? for (size_t i = 0; i < count; ++i) { DoReadVer(i, dst); emit someSignal_2(???); // (апдейтим) что здесь? И где cancel ? } emit someSignal_3(???); // (завершаем) а если ушли по exception из DoReadVer ? return dst;}
C++ (Qt)std::vector<Vertex> ReadVertices( Model * model ){ std::vector<Vertex> dst; size_t count = model->numVertices(); UserIndicator indicator("Reading Vertices", "Step", 0, count); for (size_t i = 0; i < count; ++i) { DoReadVer(i, dst]); indicator.Update(1); if (indicator.IsCancel()) break; }// ~UserIndicator return dst;}
C++ (Qt)class VertexLoader{public: VertexLoader() : m_canceled( false ) {} void load( Model *model ) { size_t count = model->numVertices(); emit started( count ); for( size_t i = 0; i < count; ++i ) { DoReadVer( i, m_data ); emit update( i ); if( m_canceled ) break; } } signals: void started( size_t cnt ); void update( size_t cur ); void finished(); public slots: void cancel() { m_canceled = true; } private: std::vector<Vertex> m_data; bool m_canceled;};
C++ (Qt)VertexLoader ldr;ProgressDialog dlg; connect( &ldr, SIGNAL(started(size_t)), &dlg, SLOT(started(size_t)) );connect( &ldr, SIGNAL(update(size_t)), &dlg, SLOT(update(size_t)) );connect( &ldr, SIGNAL(finished()), &dlg, SLOT(finished()) ); connect( &dlg, SIGNAL(pressCancel()), &ldr, SLOT(cancel()) );
C++ (Qt)class VertexLoader{public: VertexLoader() : m_canceled( false ) {}...