Многопоточность QT - вызов функции из потока в главном окне. cpp - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь получить поток для вызова функции testing() за mainwindow.cpp когда-либо X количество секунд.

Я реализовал класс с именем AutoSaveThread.

Файл заголовка выглядит следующим образом:

#ifndef AUTOSAVETHREAD_H
#define AUTOSAVETHREAD_H

#include <QtCore>

#include <unistd.h>

class AutoSaveThread : public QThread
{
public:
    AutoSaveThread(QObject*);
    void run();

signals:
    void callTest();


};

#endif // AUTOSAVETHREAD_H

А метод. cpp выглядит так, что файл выглядит следующим образом:

#include "autosavethread.h"

AutoSaveThread::AutoSaveThread(QObject *parent){
    connect(this, SIGNAL(callTest()), parent, SLOT(testing()));
}

void AutoSaveThread::run()
{
    while(true){
        sleep(3);
        emit callTest();
        // call autosave in mainwindow.cpp
    }
}


main. cpp где я создаю свои потоки следующим образом:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    AutoSaveThread myThread(&w);
    myThread.start();
    w.show();
    return a.exec();
}

Функция теста:

void MainWindow::testing()
{
    qDebug()<<"nice";
}

Когда я пытаюсь запустить этот код, я получаю следующий вывод:

Undefined symbols for architecture x86_64:
  "AutoSaveThread::callTest()", referenced from:
      AutoSaveThread::run() in autosavethread.o
ld: symbol(s) not found for architecture x86_64

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ:

После внесения изменений @Jens предложил получить следующую ошибку:

  "AutoSaveThread::callTest()", referenced from:
      AutoSaveThread::run() in autosavethread.o
  "vtable for AutoSaveThread", referenced from:
      AutoSaveThread::AutoSaveThread(QObject*) in autosavethread.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Перво-наперво: вы не запускаете программу, вы пытаетесь скомпилировать ее, и в результате вы получаете ошибку сборки: вам не хватает реализации callTest ().

Для использования сигналов и слотов заголовок autosavethread.h должен быть скомпилирован с помощью компилятора mo c. Это создаст отсутствующие методы.

Файлы, сгенерированные mo c, должны быть скомпилированы и связаны с остальными вашими источниками.

Чтобы это работало, ваш класс должен быть оснащен ключевым словом Q_OBJECT:

class AutoSaveThread : public QThread
{
   Q_OBJECT
public:

Рекомендация: используйте Qt Creator и начните с простого образца. Тогда переходите к использованию потоков. Потоки сделают вещи намного более неясными для вас - особенно если вы запустите свой поток перед запуском своей основной программы, вы можете столкнуться с различными проблемами.

0 голосов
/ 11 апреля 2020

Если вы хотите запускать обработчик в Qt каждые X секунд, тогда вам вообще не нужно создавать поток. Просто создайте экземпляр QTimer, установите желаемый интервал с помощью QTimer::setInterval() и подключите сигнал QTimer::timeout к слоту / обработчику, который вы хотите запустить.

Рабочий пример приведен в разделе подробностей на странице QTimer do c page .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...