00001 /********************************************************************** 00002 QueueManager - Generic queue manager to track running structures 00003 00004 Copyright (C) 2010-2011 by David C. Lonie 00005 00006 This program is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation version 2 of the License. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 ***********************************************************************/ 00015 00016 #ifndef QUEUEMANAGER_H 00017 #define QUEUEMANAGER_H 00018 00019 #include <globalsearch/tracker.h> 00020 00021 class QDateTime; 00022 00023 namespace GlobalSearch { 00024 class OptBase; 00025 class Structure; 00026 00094 class QueueManager : public QObject 00095 { 00096 Q_OBJECT 00097 00098 public: 00105 explicit QueueManager(QThread *thread, OptBase *parent); 00106 00110 virtual ~QueueManager(); 00111 00112 signals: 00117 void movedToQMThread(); 00118 00126 void structureStarted(GlobalSearch::Structure *s); 00127 00132 void structureSubmitted(GlobalSearch::Structure *s); 00133 00140 void structureKilled(GlobalSearch::Structure *s); 00141 00147 void structureUpdated(GlobalSearch::Structure *s); 00148 00154 void structureFinished(GlobalSearch::Structure *s); 00155 00161 void needNewStructure(); 00162 00172 void newStatusOverview(int optimized, int running, int failing); 00173 00174 // Work around for Qt 4.6.3 00175 #if QT_VERSION == 0x040603 00176 void newStructureQueued(); 00177 #endif // QT_VERSION == 4.6.3 00178 00179 public slots: 00183 void reset(); 00184 00194 void killStructure(Structure *s); 00195 00207 void appendToJobStartTracker(Structure *s); 00208 00218 void addManualStructureRequest(int requests = 1); 00219 00223 QList<Structure*> getAllPreoptimizingStructures(); 00224 00228 QList<Structure*> getAllRunningStructures(); 00229 00234 QList<Structure*> getAllOptimizedStructures(); 00235 00240 QList<Structure*> getAllDuplicateStructures(); 00241 00245 QList<Structure*> getAllStructures(); 00246 00253 QList<Structure*> lockForNaming(); 00254 00261 void unlockForNaming(Structure *s = 0); 00262 00263 protected slots: 00269 void checkLoop(); 00270 00275 void senderHasFinishedPreoptimization(); 00276 00285 void addStructureToSubmissionQueue(GlobalSearch::Structure *s, int optStep); 00286 00296 void addStructureToSubmissionQueue(GlobalSearch::Structure *s) { 00297 addStructureToSubmissionQueue(s, 0);} 00298 00303 void moveToQMThread(); 00304 00309 void setupConnections(); 00310 00311 protected: 00313 OptBase *m_opt; 00314 00316 QThread *m_thread; 00317 00319 Tracker *m_tracker; 00320 00324 void updateQueue(); 00325 00335 void updateStructure(Structure *s); 00336 00346 void startPreoptimization(); 00347 00355 void startJob(); 00356 00362 void stopJob(Structure *s); 00363 00380 void checkPopulation(); 00381 00389 void checkRunning(); 00390 00396 void handleOptimizedStructure(Structure *s); 00397 00403 void handleStepOptimizedStructure(Structure *s); 00404 00410 void handleWaitingForOptimizationStructure(Structure *s); 00411 00417 void handleInProcessStructure(Structure *s); 00418 00424 void handleEmptyStructure(Structure *s); 00425 00431 void handlePreoptimizingStructure(Structure *s); 00432 00438 void handleUpdatingStructure(Structure *s); 00439 00445 void handleErrorStructure(Structure *s); 00446 00452 void handleSubmittedStructure(Structure *s); 00453 00459 void handleKilledStructure(Structure *s); 00460 00466 void handleRemovedStructure(Structure *s); 00467 00473 void handleDuplicateStructure(Structure *s); 00474 00480 void handleRestartStructure(Structure *s); 00481 00482 // These run in the background and are called by the above 00483 // functions via QtConcurrent::run. 00485 void handleOptimizedStructure_(Structure *s); 00486 void handleStepOptimizedStructure_(Structure *s); 00487 void handleInProcessStructure_(Structure *s); 00488 void handleErrorStructure_(Structure *s); 00489 void handleSubmittedStructure_(Structure *s); 00490 void handleKilledStructure_(Structure *s); 00491 void handleDuplicateStructure_(Structure *s); 00492 void handleRestartStructure_(Structure *s); 00494 00495 // Other background handlers 00497 void addStructureToSubmissionQueue_(Structure *s, int optStep); 00498 void startJob_(Structure *s); 00499 00500 #if QT_VERSION == 0x040603 00501 protected slots: 00502 #endif // QT_VERSION == 4.6.3 00503 void unlockForNaming_(); 00504 #if QT_VERSION == 0x040603 00505 protected: 00506 #endif // QT_VERSION == 4.6.3 00507 00508 00509 // Trackers for above handlers 00511 Tracker m_newlyOptimizedTracker; 00512 Tracker m_stepOptimizedTracker; 00513 Tracker m_inProcessTracker; 00514 Tracker m_errorTracker; 00515 Tracker m_submittedTracker; 00516 Tracker m_newlyKilledTracker; 00517 Tracker m_newDuplicateTracker; 00518 Tracker m_restartTracker; 00519 Tracker m_newSubmissionTracker; 00521 00523 Tracker m_needPreOptTracker; 00525 Tracker m_preOptTracker; 00527 Tracker m_runningTracker; 00529 Tracker m_jobStartTracker; 00532 Tracker m_newStructureTracker; 00533 00535 int m_requestedStructures; 00536 00538 bool m_isDestroying; 00539 00541 QDateTime *m_lastSubmissionTimeStamp; 00542 }; 00543 00544 } // end namespace GlobalSearch 00545 00546 #endif