crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

zuze
  опции профиля:
сообщение 4.11.2012, 17:26
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пожалуйста помогите мне с вопросами связанные с программой состоящей из двух потоков.

Описание:
Программа создаёт окно в котором три кнопки.
Первая кнопка запускает и останавливает поток "А".
Вторая кнопка запускает и останавливает поток "В".
Третья кнопка выход из программы.
Поток "А" печатает символ "А".
Поток "В" печатает символ "В".

Создал проект и в нём сделал 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. Если есть ещё какие-то нюансы которые я не заметил, напишите пожалуйста?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 28.5.2025, 21:57