Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 96

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

Π’ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ графичСский ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс выполняСтся Π² своСм собствСнном ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° осущСствляСтся Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚Π°ΠΊΠΈΠ΅ прилоТСния способны Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ прСимущСством ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² многопроцСссорных систСмах ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… процСссорах, увСличивая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ сначала продСмонстрируСм способы создания подкласса QThread ΠΈ способы примСнСния классов QMutex, QSemaphore ΠΈ QWaitCondition для синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ рассмотрим способы взаимодСйствия Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π² Ρ…ΠΎΠ΄Π΅ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий. НаконСц, ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠΌ Π³Π»Π°Π²Ρƒ ΠΎΠ±Π·ΠΎΡ€ΠΎΠΌ классов Qt, объясняя, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ….

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° прСдставляСт собой ΠΎΠ±ΡˆΠΈΡ€Π½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ посвящаСтся ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ½ΠΈΠ³. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ прСдполагаСтся, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΡƒΠΆΠ΅ извСстны ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ программирования, поэтому основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ удСляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ срСдствами Qt, Π° Π½Π΅ Ρ‚Π΅ΠΌΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² выполнСния Π² Ρ†Π΅Π»ΠΎΠΌ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Qt достаточно просто: ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ создаСм подкласс QThread ΠΈ пСрСопрСдСляСм Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ run(). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с рассмотрСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΎΡ‡Π΅Π½ΡŒ простого подкласса QThread, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСриодичСски Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° консоль Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ тСкст:

01 class Thread : public QThread

02 {

03 Q_OBJECT

04 public:

05 Thread();

06 void setMessage(const QString &message);

07 void stop();

08 protected:

09 void run();

10 private:

11 QString messageStr;

12 volatile bool stopped;

12 };

Класс Thread наслСдуСт QThread ΠΈ пСрСопрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ run(). Он содСрТит Π΄Π²Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: setMessage() ΠΈ stop().

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ stopped ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ со спСцификатором volatile (ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹ΠΉ), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ доступ ΠΊ Π½Π΅ΠΉ осущСствляСтся ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ всСгда ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΅Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если ΠΌΡ‹ опустим ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово volatile, компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

01 Thread::Thread()

02 {

03 stopped = false;

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(). Π­Ρ‚ΠΎ обСспСчиваСт Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· прилоТСния, хотя Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

Если ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ прилоТСния Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ Start А, консоль заполнится Π±ΡƒΠΊΠ²Π°ΠΌΠΈ «А». Если Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ Start Π’, консоль заполнится ΠΏΠΎΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ Π±ΡƒΠΊΠ² «А» ΠΈ Β«Π’Β». НаТмитС ΠΊΠ½ΠΎΠΏΠΊΡƒ Stop А, ΠΈ Ρ‚ΠΎΠ³Π΄Π° Π½Π° экран Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠΊΠ² Β«Π’Β».

Бинхронизация ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ являСтся синхронизация Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Для этого Π² Qt прСдусмотрСны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ классы: QMutex, QReadWriteLock, QSemaphore ΠΈ QWaitCondition.

Класс QMutex обСспСчиваСт Ρ‚Π°ΠΊΡƒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ участка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ доступ ΠΊ Π½ΠΈΠΌ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. Π­Ρ‚ΠΎΡ‚ класс содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ lock(), которая Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ (mutex). Если ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Ρ€Π°Π±ΠΎΡ‚Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° блокируСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ освободит Π΅Π³ΠΎ. Π’ любом случаС послС Π²Ρ‹Π·ΠΎΠ²Π° lock() Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ unlock(). Класс QMutex содСрТит Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tryLock(), которая сразу ΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Ссли ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΡƒΠΆΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ stopped класса Thread ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ QMutex. Π’ΠΎΠ³Π΄Π° ΠΌΡ‹ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊ классу Thread ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽβ€”Ρ‡Π»Π΅Π½:

private:

QMutex mutex;

…