2014-11-13 1 views
1

Извините, я недостаточно опытен, чтобы понять ошибку, которую я получаю, и вот уже несколько недель я пытаюсь понять, в чем проблема.(Qt5, Threads) Примеры, которые я следую, не работают

ЧТО Я НУЖДАЮТСЯ ДОПОЛНИТЬ:
Запуск нескольких потоков для одновременного управления оборудованием и тестами.

МОЙ КОД:
I Приведенный ниже пример here. Этот пример также доступен на многих других сайтах, поэтому он должен работать.

В моем main коде у меня есть:

MotorClass *MotorObj = new MotorClass; 
QThread *MotorThread = new QThread; 

MotorObj->moveToThread(MotorThread); 

connect(MotorThread, SIGNAL(started()), MotorObj, SLOT(RunMotor())); 
connect(MotorObj, SIGNAL(finished()), MotorThread, SLOT(quit())); 
connect(MotorObj, SIGNAL(finished()), MotorObj, SLOT(deleteLater())); 
connect(MotorThread, SIGNAL(finished()), MotorThread, SLOT(deleteLater())); 

MotorThread->start(); 

В моей MotorClass.h у меня есть:

class MotorClass : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit MotorClass(QObject *parent = 0); 
    ~MotorClass(); 

public slots: 
    void RunMotor(); 

signals: 
    void finished(); 

}; 

В моей MotorClass.cpp у меня есть:

MotorClass::MotorClass(QObject *parent) : QObject(parent) 
{ 
} 

MotorClass::~MotorClass() 
{ 
} 

void MotorClass::RunMotor() 
{ 
    qDebug("running"); 
    emit finished(); 
} 


МОЯ ПРОБЛЕМА:
qDebug() отображает сообщение «running», но затем за ним следует следующий вывод и сбой программы.

QWinEventNotifier: event notifiers cannot be disabled from another thread 
QWinEventNotifier: event notifiers cannot be disabled from another thread 
QWinEventNotifier: event notifiers cannot be disabled from another thread 
The program has unexpectedly finished. 


, что я пытался до сих пор:
Если я закомментируйте connect код, который предполагает, чтобы закрыть MotorThread и MotorObj, ошибки исчезают, но, очевидно, после запуска программы в течение длительного времени в то время, причины он разбился. Я понимаю, это потому, что MotorObj и MotorThread не закрываются. Я пробовал другие методы, такие как наследование класса QThread, а затем повторное внедрение функции run(), но это не касается моих требований, а также не рекомендуется использовать QThread.

Любые идеи, в которых я ошибаюсь ???

+1

Где вы начинаете свой рассказ (не думайте, что указанная выше строка единственная) и как часто? – Robert

+0

В коде, который вы опубликовали, ничего плохого нет. У вас есть что-то еще? – thuga

+0

Привет. У меня есть MainWindow, работающий как основной поток. Код MainWindow содержит основной код, который вы видите выше. Отсюда я создаю MotorThread и MotorObj.Код, который вы видите выше из моего MainWindow, вызывается только один раз, за ​​исключением MotorThread.start(), который вызывается из цикла for в коде MainWindow. Цикл for повторяется около 5000 раз в течение одного дня. – Achmed

ответ

0
connect(MotorThread, SIGNAL(started()), MotorObj, SLOT(RunMotor())); 
connect(MotorObj, SIGNAL(finished()), MotorThread, SLOT(quit())); 
connect(MotorObj, SIGNAL(finished()), MotorObj, SLOT(deleteLater())); 
connect(MotorThread, SIGNAL(finished()), MotorThread, SLOT(deleteLater())); 

Похоже, что вы удаляете MotorThread после завершения первого запуска. Итак, следующая MotorThread->start() программа должна потерпеть крах, так как это всего лишь висячий указатель. Однако даже если вы удалите последнее соединение, также MotorObj больше не существует, поэтому слот может быть вызван только один раз.

Почему вы не звоните deleteLater() сразу после того, как объекты больше не нужны !?

+0

Извините, Роберт. Я сделал неправильное заявление выше. Весь код, показанный выше, вызывается из цикла for. Другими словами ... Для каждой итерации цикла for создаются новые MotorThread и MotorObj, затем MotorObj перемещается в MotorThread, затем подключает слоты и сигналы, а затем после этого вызываю MotorThread.Start, как показано выше. Но эта ошибка также возникает, когда я запускаю цикл for один раз. – Achmed

+1

Я думаю, что проблема находится где-то в моем основном коде, а не в коде, который я написал выше. Теперь я создал новую программу и скопировал в нее вышеуказанный код. Тогда это работает. Значение Я делаю что-то еще неправильно в моей основной программе. Позвольте мне проверить мой код MainWindow, и я дам вам знать, что я нахожу. Спасибо за ваш отзыв. По крайней мере, я начну увеличивать масштаб проблемы. – Achmed

0

Хорошо. Поэтому после следующей недели сидения и попытки понять эту странную проблему, и я нашел решение. Но я не понимаю, почему возникла проблема. Я создал новые файлы заголовков и .cpp для MotorClass и скопировал весь код из исходных файлов в новые. Проблема исчезла. Теперь все работает нормально. Однако это не имеет смысла. Но спасибо за вашу помощь.

Смежные вопросы