Пожалуйста помогите мне с вопросами связанные с программой состоящей из двух потоков.Описание:Программа создаёт окно в котором три кнопки.
Первая кнопка запускает и останавливает поток "А".
Вторая кнопка запускает и останавливает поток "В".
Третья кнопка выход из программы.
Поток "А" печатает символ "А".
Поток "В" печатает символ "В".
Создал проект и в нём сделал 5 файлов с кодом:1. main.cpp
2. thread.cpp
3. thread.h
4. threaddialog.cpp
5. threaddialog.h
Файл main.cpp#include <QApplication>
#include "threaddialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ThreadDialog dialog;
dialog.show();
return app.exec();
}
Файл thread.cpp#include <QtCore>
#include <iostream>
using namespace std;
#include "thread.h"
Thread::Thread()
{
stopped = false;
}
void Thread::setMessage(const QString &message)
{
messageStr = message;
}
void Thread::run()
{
while (!stopped)
cerr << qPrintable(messageStr);
stopped = false;
cerr << endl;
}
void Thread::stop()
{
stopped = true;
}
Файл thread.h#ifndef THREAD_H // Обявление заголовочного файла
#define THREAD_H // Обявление заголовочного файла
#include <QThread> // Объявление родительского класса
class Thread : public QThread
{
Q_OBJECT
public:
Thread();
void setMessage(const QString &message);
void run();
void stop();
private:
QString messageStr;
volatile bool stopped;
};
#endif // THREAD_H // Обявление заголовочного файла
Файл threaddialog.cpp#include <QtGui>
#include "threaddialog.h"
ThreadDialog::ThreadDialog(QWidget *parent) : QDialog(parent)
{
threadA.setMessage("A");
threadB.setMessage("B");
threadAButton = new QPushButton(tr("Start A"));
threadBButton = new QPushButton(tr("Start B"));
quitButton = new QPushButton(tr("Quit"));
quitButton->setDefault(true);
connect(threadAButton, SIGNAL(clicked()), this, SLOT(startOrStopThreadA()));
connect(threadBButton, SIGNAL(clicked()), this, SLOT(startOrStopThreadB()));
connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addWidget(threadAButton);
mainLayout->addWidget(threadBButton);
mainLayout->addWidget(quitButton);
setLayout(mainLayout);
setWindowTitle(tr("Threads"));
}
void ThreadDialog::startOrStopThreadA()
{
if (threadA.isRunning())
{
threadA.stop();
threadAButton->setText(tr("Start A"));
}
else
{
threadA.start();
threadAButton->setText(tr("Stop A"));
}
}
void ThreadDialog::startOrStopThreadB()
{
if (threadB.isRunning())
{
threadB.stop();
threadBButton->setText(tr("Start B"));
}
else
{
threadB.start();
threadBButton->setText(tr("Stop B"));
}
}
Файл threaddialog.h#ifndef THREADDIALOG_H
#define THREADDIALOG_H
#include <QDialog>
#include "thread.h"
class QPushButton;
class ThreadDialog : public QDialog
{
Q_OBJECT
public:
ThreadDialog(QWidget *parent = 0);
protected:
void closeEvent(QCloseEvent *event);
private slots:
void startOrStopThreadA();
void startOrStopThreadB();
private:
Thread threadA;
Thread threadB;
QPushButton *threadAButton;
QPushButton *threadBButton;
QPushButton *quitButton;
};
#endif // THREADDIALOG_H
1. В "Nokia Qt SDK Win online v1.0.2 (2010)" при запуске терминала выдаётся ошибка "Failed to read env file: No error".
2. В "Nokia Qt SDK Win offline v1.2.1 (2012)" Данные потоков почему-то выводятся в окне "Вывод приложения", аналог окна "Консоль приложения" в старых версиях.
Если, запускаешь два потока очень быстро подвисает Qt Creator. Если запускаешь терминал выдаётся ошибка "Failed to read env file: No error".
Вопросы:1. Почему в "Nokia Qt SDK Win online v1.0.2 (2010)" не выводятся результаты потоков и как это поправить?
2. Правильно ли что в "Nokia Qt SDK Win offline v1.2.1 (2012)" результаты потоков выводятся в окне "Вывод приложения", а не в терминале?
3. Подвисает Qt Creator после запуска двух потоков это следствие того что я в программе не сделал синхронизацию потоков?
4. Если есть ещё какие-то нюансы которые я не заметил, напишите пожалуйста?