Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Eten от Июль 25, 2013, 07:09



Название: Не могу понять связи виртуальных таблиц и класса потока (Решено)
Отправлено: Eten от Июль 25, 2013, 07:09
Всем доброго дня.

У меня такая проблема. Написал сам от руки, пример из книжки Шлее про потоки. У него работает из прилагающегося примера к книге, а меня вылазиет ошибка: undefined reference to `vtable for MyThread'

Не понимаю, причем тут виртуальные таблицы, когда метод run переопределен.

И да, кстати, когда создавал объект класса MyThread без указателей, ошибка описанная выше вылезла не один раз, а целых три.

Что я сделал не так?! Вроде, все правильно написал.  ???

Привожу код main.cpp:
Код:
#include <QApplication>
#include <QtGui>

class MyThread : public QThread {
Q_OBJECT
private:
    int m_nValue;

public:
    MyThread() : m_nValue(10)
    {
    }

protected:
    void run()
    {
        QTimer timer;
        connect(&timer, SIGNAL(timeout()), SLOT(slotNextValue()));
        timer.start(1000);

        exec();
    }

signals:
    void finished    (   );
    void currentValue(int);

public slots:
    void slotNextValue()
    {
        emit currentValue(--m_nValue);

        if (!m_nValue) {
            emit finished();
        }

    }
};


int main (int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyThread *m = new MyThread();

    m->start();

    return app.exec();
}


Название: Re: Не могу понять связи виртуальных таблиц и класса потока
Отправлено: gil9red от Июль 25, 2013, 07:12
Переместите класс в h файл  :)


Название: Re: Не могу понять связи виртуальных таблиц и класса потока
Отправлено: Fat-Zer от Июль 25, 2013, 08:46
или в конец допиши #include "main.moc"


Название: Re: Не могу понять связи виртуальных таблиц и класса потока
Отправлено: Bepec от Июль 25, 2013, 08:50
Аплодисменты сотен поклонников иных IDE, чем QtCreator, аплодируют ногами, стоя на голове, предыдущему комментарию и желают ему больше не раскидывать такие ценные слова.

Update: Ok, Константин. Просто напоминает мне этот совет про один проект, над переводом которого в удобочитаемый и компилируемый вид я занимался месяцок.


Название: Re: Не могу понять связи виртуальных таблиц и класса потока
Отправлено: Eten от Июль 25, 2013, 09:13
Спасибо, сработало.

А можно еще вопрос. Я этот пример стал пробовать, когда столкнулся с такой же проблемой у себя в программе. Изначально у меня был класс потока MyThread в h файле класса RILFeniksEngine, в котором я его собирался использовать. В том h файле он был прописан, как в коде первого поста, а другой класс RILFeniksEngine был описан без кода методов, код методов я прописал в cpp файле. И у меня сработала такая же ошибка.

Когда я вынес класс потока MyThread в отдельный h файл, без всяких cpp файлов к нему, и подключил его к h файлу упомянутому выше класса RILFeniksEngine, все заработало.

Вот так у меня было изначально h файл, о котором говорилось ранее (все методы класса RILFeniksEngine прописаны в cpp файле):
Код:
#ifndef NENGINE_H
#define NENGINE_H

#include <QThread>
#include <QTimer>
#include <QObject>

#include "subsystemsoftheengine.h" //этот файл подключает файлы подсистем в класса RILFeniksEngine, и никак не влияет на класс потока по данной теме

class MyThread : public QThread {
Q_OBJECT
private:
    int m_nValue;

public:
    MyThread() : m_nValue(10)
    {
    }

    void run()
    {
        QTimer timer;
        connect(&timer, SIGNAL(timeout()), SLOT(slotNextValue()));
        timer.start(1000);

        //exec();
    }

signals:
    void finished    (   );
    void currentValue(int);

public slots:
    void slotNextValue()
    {
        emit currentValue(--m_nValue);

        if (!m_nValue) {
            emit finished();
        }

    }
};

class RILFeniksEngine
{

public:
    RILFeniksEngine();

    ~RILFeniksEngine();

    //Запуск игры
    void Run();

    //Вывод текста экрана
    QString GetScreen(int indexScreen = 0);


    //Загрузка данных игры в проигрыватель
    void LoadGame(QString PathFile);

private:

    //Подсистема работы со стеком
    RFSubsystemStack* ptSubsystemStack;

    //Подсистема выполнения команд
    RFSubsystemCommandsExecution* ptSubsystemCommandsExecution;

    //Подсистема областей данных
    RFSubsystemDataArea* ptSubsystemDataArea;

    //Подсистема экранов
    RFESubsystemScreens* ptSubsystemScreens;

    //Статус выполнения игры
    RFStatusGameExecution* theStatusGameExecution;

    //Тот самый объект класса потока
    MyThread  *m;
};

#endif // NENGINE_H

Объект m класса MyThread, создаю в конструкторе и там же его запускаю, ровно также как и все подобные ему объекты.

А из-за чего не работает, когда я так прописывал, как было указано в изначальном варианте кода, так и не понял.  ???


Название: Re: Не могу понять связи виртуальных таблиц и класса потока
Отправлено: ритт от Июль 25, 2013, 09:45
Аплодисменты сотен поклонников иных IDE, чем QtCreator, аплодируют ногами, стоя на голове, предыдущему комментарию и желают ему больше не раскидывать такие ценные слова.
будьте более конструктивны в своих комментариях. сарказм не по существу пользы не несёт.