J'ai besoin d'un moyen d'exécuter une fonction de mise à jour de la mienne dans le fil principal. Je n'ai pas pu trouver un signal qui me cocherait à chaque fois que la boucle principale fonctionne. p>
Est-ce que je fais ça mal? Est-ce une chose QT de forcer le code de l'utilisateur à exécuter dans des threads si nous voulons exécuter quelque chose dans une boucle? P>
3 Réponses :
auto timer = new QTimer(parent);
connect(timer, &QTimer::timeout, contextObj, []{/* your code here */});
timer->start();
Donc, si je comprends bien, je vais devoir appeler Singleshot à chaque fois que mon code est exécuté si je veux le faire courir dans chaque itération? Cela semble terriblement inefficace.
@awpsolet Vous pouvez utiliser un QTIMER normal dans ce cas. J'ai mis à jour la réponse.
Il convient de noter que ce code ne fonctionne tristement pas à partir de threads non démarrés via qthread: "Les minuteries ne peuvent être utilisées qu'avec des threads ont commencé avec QThread"
Alternativement, si vous souhaitez exécuter votre code chaque fois que la boucle d'événement vous permet d'utiliser l'invocation de la méthode Slot via la connexion en file d'attente:
class EvtLoopTicker : public QObject
{
Q_OBJECT
public:
EvtLoopTicker(QObject *pParent = nullptr)
: QObject(pParent)
{}
public slots:
void launch()
{
tickNext();
}
private slots:
void tick()
{
qDebug() << "tick";
// Continue ticking
tickNext();
}
private:
void tickNext()
{
// Trigger the tick() invokation when the event loop runs next time
QMetaObject::invokeMethod(this, "tick", Qt::QueuedConnection);
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
EvtLoopTicker ticker;
ticker.launch();
return a.exec();
}
Une autre façon serait de remplacer: enregistrer un utilisateur Exemple: P> qevent code> et postez l'événement sur qcoreappplicatio :: instance () code () code >. Évidemment, l'approche QTIMER CODE> est supérieure, mais celle-ci fonctionnera même si le fil émetteur n'a pas été créé par qt ( qthread code>). P> MainThreadEvent::post(
[p = QPointer(this)]()
{
if (p)
{
p->update();
}
}
);
C'est ce que les minuteries zéro-timeout sont pour :)
Qu'est-ce que vous voulez cocher chaque fois que la boucle d'événement fonctionne? Cela pourrait rendre l'UI lente de le faire dans le fil principal et vider l'énergie inutilement
J'ai besoin d'appeler le boost :: Fonction de sondage Asio :: io_service dans la maintenance, j'ai besoin de mon IO pour compléter dans le maintien de la maintenance.