J'ai un code C++ incluant une interface graphique, dans lequel j'ai besoin d'exécuter une boucle de temps pour l'optimisation.Utilisation de QThread Basic en C++
class OptimizationAlgorith(data *data);
{
private:
var var1;
var var2;
public:
method1();
method2();
..
timeConsumingMethod(data);
}
ce besoin d'être appelé dans une classe GUI comme suit:
class QRegistration: public QWidget
{
Q_OBJECT
private:
data *m_data;
QPushButton *m_button_run;
OptimizationAlgorithm *m_optimizationalgorithm;
WorkerThread *m_workerThread;
QThread *m_thread;
..
private slots:
void on_pushButton_run_clicked();
void registrationDone();
J'ai besoin de déplacer le timeConsumingMethod
dans un fil séparé de fil conducteur, de sorte que l'interface graphique ne freez en timeConsumingMethod
est fonctionnement. J'ai fait une nouvelle classe « WorkerThread » en utilisant la documentation officielle de Qt, qui ressemble à:
class WorkerThread : public QObject
{
Q_OBJECT
public:
WorkerThread(ApplicationData* data, QOptimizationAlgorithm * OptimizationAlgorithm);
~WorkerThread();
public slots:
void run(data* data);
signals:
void finished();
private slots:
private:
OptimizationAlgorithm *m_OptimizationAlgorithm;
ApplicationData *m_data;
}
Comment shoud je mettre en œuvre maintenant mon run()
en WorkerThread
? Puis-je écrire simplement:
void WorkerThread::run(data *m_data)
{
m_optimization.timeConsumingMethod(m_data);
emit finished();
}
ou dois-je copier la définition de toute timeConsumingMethod
dans run()
? Pourquoi pourquoi pas?
Vous n'avez pas besoin de réimplémenter méthode 'run' si vous utilisez un modèle « travailleur ». Essayez de lire la documentation Qt, il existe des exemples parfaits. –
Vous n'avez pas besoin de copier la définition complète de timeConsumingMethod, tout code appelé dans run() s'exécutera dans le thread de WorkerThread, pour prouver que la fonction QThread :: currentThreadId() est utilisée pour obtenir l'ID de thread. – nikitoz