Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

04 }

Мы устанавливаем в конструкторе переменную stopped на значение false.

01 void Thread::run

02 {

03 while (!stopped)

04 cerr << qPrintable(messageStr);

05 stopped = false;

06 cerr << endl;

07 }

Функция run вызывается для запуска потока. Пока переменная stopped имеет

значение false, эта функция будет выводить на консоль заданное сообщение. Работа потока завершается, когда завершается функция run.

01 void Thread::stop

02 {

03 stopped = true;

04 }

Функция stop устанавливает переменную stopped на значение true, тем самым указывая функции run на необходимость прекращения вывода текстовых сообщений на консоль. Данная функция может вызываться из любого потока в любое время. В нашем примере мы предполагаем, что присваивание значения переменной типа bool является атомарной операцией. Такое предположение является разумным, учитывая, что переменная типа bool может иметь только два состояния. Позже мы рассмотрим в данном разделе способы применения класса QMutex, гарантирующего атомарность операции присваивания значения переменной.

Класс QThread содержит функцию terminate, которая прекращает выполнение потока, если он все еще не завершен. Функцию terminate не рекомендуется применять, поскольку она может остановить поток в произвольной точке и не позволяет потоку выполнить очистку после себя. Всегда надежнее использовать переменную stopped и функцию stop, как мы уже делали здесь.

Рис. 18.1. Приложение Threads.

Теперь мы рассмотрим способы применения класса Thread в небольшом приложении Qt, которое применяет два потока, А и В, не считая главный поток.

01 class ThreadDialog : public QDialog

02 {

03 Q_OBJECT

04 public:

05 ThreadDialog(QWidget *parent = 0);

06 protected:

07 void closeEvent(QCloseEvent *event);

08 private slots:

09 void startOrStopThreadA;

10 void startOrStopThreadB;

11 private:

12 Thread threadA;

13 Thread threadB;

14 QPushButton *threadAButton;

15 QPushButton *threadBButton;

16 QPushButton *quitButton;

17 };

В классе ThreadDialog объявляются две переменные типа Thread и

несколько кнопок для обеспечения основных средств интерфейса пользователя.

01 ThreadDialog::ThreadDialog(QWidget *parent)

02 : QDialog(parent)

03 {

04 threadA.setMessage("А");

05 threadB.setMessage("B");

06 threadAButton = new QPushButton(tr("Start А"));

07 threadBButton = new QPushButton(tr("Start В"));

08 quitButton = new QPushButton(tr("Quit"));

09 quitButton->setDefault(true);

10 connect(threadAButton, SIGNAL(clicked),

11 this, SLOT(startOrStopThreadA));

12 connect(threadBButton, SIGNAL(clicked),

13 this, SLOT(startOrStopThreadB));

14 …

15 }

В конструкторе мы вызываем функцию setMessage для периодического вывода на экран первым потоком буквы «А» и вторым потоком буквы «В».

01 void ThreadDialog::startOrStopThreadA

02 {

03 if (threadA.isRunning) {

04 threadA.stop;

05 threadAButton->setText(tr("Start А"));

06 } else {

07 threadA.start;

08 threadAButton->setText(tr("Stop А"));

09 }

10 }

Когда пользователь нажимает кнопку потока А, функция startOrStopThreadA останавливает поток, если он выполняется, и запускает его в противном случае. Она также обновляет текст кнопки.

01 void ThreadDialog::startOrStopThreadB

02 {

03 if (threadB.isRunning) {

04 threadB.stop;

05 threadBButton->setText(tr("Start В"));

06 } else {

07 threadB.start;

08 threadBButton->setText(tr("Stop В"));

09 }

10 }

Программный код функции startOrStopThreadB очень похож.

01 void ThreadDialog::closeEvent(QCloseEvent *event)

02 {

03 threadA.stop;

04 threadB.stop;

05 threadA.wait;

06 threadB.wait;

07 event->accept;

08 }

Если пользователь выбирает пункт меню Quit или закрывает окно, мы даем команду останова для каждого выполняющегося потока и ожидаем их завершения (используя функцию QThread::wait) прежде, чем сделать вызов CloseEvent::accept. Это обеспечивает аккуратный выход из приложения, хотя в данном случае это не имеет значения.

Поделиться:
Популярные книги

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5