1. 实验目的
掌握多线程异构技术。
2. 实验内容与实验步骤
1. 建立线程对象
新建Qt Gui应用,名称为myThread,类名为Dialog,基类选择QDialog。打开设计界面,向其中添加四个按钮,分别控制两个线程的开启和关闭。并添加两个label用来实时更新线程的效果。向项目中添加新的C++类,类名分别设置为MyThread和MyThread2,基类设置为QThread,类型信息选择“继承自QObject”。分别在两个线程对象里添加对应的stop和run方法。具体代码如下所示:
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include
class MyThread2 : public QThread
{
Q_OBJECT
public:
explicit MyThread2(QObject *parent = 0);
void stop();
protected:
void run();
private:
volatile bool stopped;
signals:
void stringChanged(const QString &);
public slots:
};
#endif // MYTHREAD_H
而另外一个线程对象的声明类似。
其中,我们在声明指示线程状态的私有变量stop的时候使用了volatile来避免编译器的优化保证了程序的实时性。
而在我们的diolog的类声明里,我们使用两个线程类的变量以实现双线程,这样,我们的两个线程其实已经建立了。
2. 具体线程动作的编写。
本实实验对于同样一个类实现两个线程,即两个线程操作的行为相似,但是为了能够使两个线程同时作用所以两个类的作用对象有些许差异。
具体到对应的线程类可以编写对应代码为:
MyThread2::MyThread2(QObject *parent):
QThread(parent)
{
stopped2 = false;
}
void MyThread2::run()
{
long int i = 0;
while (!stopped2) {
QString str = QString("in MyThread2: %1").arg(i);
emit stringChanged(str);
msleep(1000);
i++;
}
stopped2 = false;
}
void MyThread2::stop()
{
stopped2 = true;
}
对于运行函数,即该线程主要做的工作,我们首先判断stop的状态,如果stop为0,则证明程序仍然应该运行,那么我们就依然执行该线程,在此线程中,将传递出一个改变字符串的消息,利用此消息可向对应的槽发送对应的字符串。为了使程序运行更易于观察,我们延缓了计数器增长的时间,设定为休眠一秒再增加一。
3. 对于线程的控制操作
对于UI的四个按钮分别添加对应的槽,对于启动线程和结束线程的按钮我们编写程序如下所示:
void Dialog::on_startButton2_clicked()
{
thread2.start();
ui->startButton2->setEnabled(false);
ui->stopButton2->setEnabled(true);
}
void Dialog::on_stopButton2_clicked()
{
if (thread2.isRunning()) {
thread2.stop();
ui->startButton2->setEnabled(true);
ui->stopButton2->setEnabled(false);
}
}
按键程序都比较简单,对于开始按键,我们就是在按下开始按键之后开始调用线程的run函数启动线程的功能,而对于关闭函数就是调用对应的stop函数关闭对应的线程。此外,当我们按下启动线程按钮的时候,我们将使得对应已经按下的启动按钮失能,防止线程run函数的对此进入,而对于终止进程按钮我们做同样的处理,已经被按下,那么就不被允许在线程未被启动的情况下按下。
可以运行程序观察程序的运行效果如下所示:
QTCreator4.6.1+windows7系统
1. 在添加新的基类对象的时候,要注意添加的基类的类型QThread需要自己手动输入,且需要勾选继承自Qobject。这是QTcreator在此步骤的时候需要编程者自己输入。
2. 对于两个不同的线程,应当能够实现“同时执行”的效果,此外,对于一个线程,除了应该编写对应的线程处理程序之外,也应该编写对应的开始运行和关闭运行的函数来实现线程的控制。
3. 在本实验中,我们编写的程序比较简单,不同线程处理的对象并不相同,对于不同线程处理对象相同的例子我们需要使用一定的保护方法来保证两个线程在对同一个对象处理的有相应的保护措施。但是在本实验较为简单的程序编写过程中,我们也掌握了线程的一般概念,以及建立并控制多线程程序的方法,进一步加深了对代码优化以及对电脑资源利用的理解。
1. 实验目的
掌握多线程异构技术。
2. 实验内容与实验步骤
1. 建立线程对象
新建Qt Gui应用,名称为myThread,类名为Dialog,基类选择QDialog。打开设计界面,向其中添加四个按钮,分别控制两个线程的开启和关闭。并添加两个label用来实时更新线程的效果。向项目中添加新的C++类,类名分别设置为MyThread和MyThread2,基类设置为QThread,类型信息选择“继承自QObject”。分别在两个线程对象里添加对应的stop和run方法。具体代码如下所示:
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include
class MyThread2 : public QThread
{
Q_OBJECT
public:
explicit MyThread2(QObject *parent = 0);
void stop();
protected:
void run();
private:
volatile bool stopped;
signals:
void stringChanged(const QString &);
public slots:
};
#endif // MYTHREAD_H
而另外一个线程对象的声明类似。
其中,我们在声明指示线程状态的私有变量stop的时候使用了volatile来避免编译器的优化保证了程序的实时性。
而在我们的diolog的类声明里,我们使用两个线程类的变量以实现双线程,这样,我们的两个线程其实已经建立了。
2. 具体线程动作的编写。
本实实验对于同样一个类实现两个线程,即两个线程操作的行为相似,但是为了能够使两个线程同时作用所以两个类的作用对象有些许差异。
具体到对应的线程类可以编写对应代码为:
MyThread2::MyThread2(QObject *parent):
QThread(parent)
{
stopped2 = false;
}
void MyThread2::run()
{
long int i = 0;
while (!stopped2) {
QString str = QString("in MyThread2: %1").arg(i);
emit stringChanged(str);
msleep(1000);
i++;
}
stopped2 = false;
}
void MyThread2::stop()
{
stopped2 = true;
}
对于运行函数,即该线程主要做的工作,我们首先判断stop的状态,如果stop为0,则证明程序仍然应该运行,那么我们就依然执行该线程,在此线程中,将传递出一个改变字符串的消息,利用此消息可向对应的槽发送对应的字符串。为了使程序运行更易于观察,我们延缓了计数器增长的时间,设定为休眠一秒再增加一。
3. 对于线程的控制操作
对于UI的四个按钮分别添加对应的槽,对于启动线程和结束线程的按钮我们编写程序如下所示:
void Dialog::on_startButton2_clicked()
{
thread2.start();
ui->startButton2->setEnabled(false);
ui->stopButton2->setEnabled(true);
}
void Dialog::on_stopButton2_clicked()
{
if (thread2.isRunning()) {
thread2.stop();
ui->startButton2->setEnabled(true);
ui->stopButton2->setEnabled(false);
}
}
按键程序都比较简单,对于开始按键,我们就是在按下开始按键之后开始调用线程的run函数启动线程的功能,而对于关闭函数就是调用对应的stop函数关闭对应的线程。此外,当我们按下启动线程按钮的时候,我们将使得对应已经按下的启动按钮失能,防止线程run函数的对此进入,而对于终止进程按钮我们做同样的处理,已经被按下,那么就不被允许在线程未被启动的情况下按下。
QTCreator4.6.1+windows7系统
1. 在添加新的基类对象的时候,要注意添加的基类的类型QThread需要自己手动输入,且需要勾选继承自Qobject。这是QTcreator在此步骤的时候需要编程者自己输入。
2. 对于两个不同的线程,应当能够实现“同时执行”的效果,此外,对于一个线程,除了应该编写对应的线程处理程序之外,也应该编写对应的开始运行和关闭运行的函数来实现线程的控制。
3. 在本实验中,我们编写的程序比较简单,不同线程处理的对象并不相同,对于不同线程处理对象相同的例子我们需要使用一定的保护方法来保证两个线程在对同一个对象处理的有相应的保护措施。但是在本实验较为简单的程序编写过程中,我们也掌握了线程的一般概念,以及建立并控制多线程程序的方法,进一步加深了对代码优化以及对电脑资源利用的理解。
对应工程文件下载