本帖最后由 静水竹林 于 2016-9-26 09:28 编辑
传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应。这个问题可以用事件处理和多线程来解决。
【Qt多线程编程】QThread类提供了与系统无关的线程。 QThread代表在程序中一个单独的线程控制,在多任务操作系统中,它和同一进程中的其它线程共享数据,但运行起来就像一个单独的程序一样。它不是在main()中开始,QThread是在run()中开始运行的。继承run()并且在其中包含自定义的代码。
【实现方法】1. 子类化QThread2. 重新实现它的run()函数就可以了。run()是个纯虚函数,是线程执行的入口,在run()里出现的代码将会在另外线程中被执行。run()函数是通过start()函数来实现调用的。
【实例】【MyThread.h】
class MyThread : public QThread {
public:
void run();
};
【MyThread.cpp】
void MyThread::run()
{
for( int count = 0; count < 20; count++ ) {
sleep( 1 );
qDebug( "Ping!" );
}
}
【mywindows.cpp】
int main()
{
MyThread a;
MyThread b;
a.start();
b.start();
a.wait();
b.wait();
}
这将会开始两个线程,每个线程在屏幕上写20次“Ping!”并且退出。在main()的结尾调用wait()是必需的,因为main()的结束会终结整个程序,它会杀掉所有其它线程。
【信号量和互斥锁】Qt互斥锁QMutexQMutex类提供了一种保护一个变量和一段代码的方法。mutex.lock()//锁住互斥量(mutex)。如果互斥量是解锁的,那么当前线程就立即占用并锁定它。否则,当前线程就会被阻塞,知道掌握这个互斥量的线程对它解锁为止。mutex.unlock()//解锁mutex.tryLock()//尝试解锁,如果该互斥量已经锁住,它就会立即返回
Qt信号量QSemaphoreQt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
【Qt创建进程的方法】 在设计一个应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该功能与当前设计的应用程序联系不大,或者是因为该功能已经可以使用现成的程序很好的实现了,这时就可以在当前的应用程序中调用外部的程序来实现该功能,这就会使用到进程。Qt应用程序可以很容易的启动一个外部应用程序,而且Qt也提供了在多种进程间通信的方法。 Qt的QProcess类用来启动一个外部程序并与其进行通信。下面我们来看一下怎么在Qt代码中启动一个进程。
【实例】【mainwindow.h】#include
,然后添加私有对象定义:QProcessmyProcess;private slots: void showResult();private: Ui::MainWindow *ui; QProcessmyProcess;在mainwindow.cpp文件中添加代码。
(1)先添加头文件包含:#include,然后在构造函数中添加如下代码:connect(&myProcess,SIGNAL(readyRead()),this, SLOT(showResult()));
(2)然后添加showResult()槽的定义:void MainWindow::showResult(){ QString str = QString(myProcess.readAll()); ui->textBrowser->setText(str);}
(3)最后将前面按钮的单击信号对应的槽更改为:void MainWindow::on_pushButton_clicked()
{
QString program = "cmd.exe";
QStringList arguments;
arguments << "/c dir&pause";
myProcess.start(program, arguments);
}
这里在启动Windows下的命令行提示符程序cmd.exe时为其提供了命令作为参数,这样可以直接执行该命令。当命令执行完以后可以执行showResult()槽来显示运行的结果。
QThread类提供了与系统无关的线程。 QThread代表在程序中一个单独的线程控制,在多任务操作系统中,它和同一进程中的其它线程共享数据,但运行起来就像一个单独的程序一样。它不是在main()中开始,QThread是在run()中开始运行的。继承run()并且在其中包含自定义的代码。【实现方法】1. 子类化QThread2. 重新实现它的run()函数就可以了。run()是个纯虚函数,是线程执行的入口,在run()里出现的代码将会在另外线程中被执行。run()函数是通过start()函数来实现调用的。 【实例】【MyThread.h】
class MyThread : public QThread {
public:
void run();
};
【MyThread.cpp】
void MyThread::run()
{
for( int count = 0; count < 20; count++ ) {
sleep( 1 );
qDebug( "Ping!" );
}
}
【mywindows.cpp】
int main()
{
MyThread a;
MyThread b;
a.start();
b.start();
a.wait();
b.wait();
}
这将会开始两个线程,每个线程在屏幕上写20次“Ping!”并且退出。在main()的结尾调用wait()是必需的,因为main()的结束会终结整个程序,它会杀掉所有其它线程。【信号量和互斥锁】Qt互斥锁QMutexQMutex类提供了一种保护一个变量和一段代码的方法。mutex.lock()//锁住互斥量(mutex)。如果互斥量是解锁的,那么当前线程就立即占用并锁定它。否则,当前线程就会被阻塞,知道掌握这个互斥量的线程对它解锁为止。mutex.unlock()//解锁mutex.tryLock()//尝试解锁,如果该互斥量已经锁住,它就会立即返回
Qt信号量QSemaphoreQt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
【Qt创建进程的方法】 在设计一个应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该功能与当前设计的应用程序联系不大,或者是因为该功能已经可以使用现成的程序很好的实现了,这时就可以在当前的应用程序中调用外部的程序来实现该功能,这就会使用到进程。Qt应用程序可以很容易的启动一个外部应用程序,而且Qt也提供了在多种进程间通信的方法。 Qt的QProcess类用来启动一个外部程序并与其进行通信。下面我们来看一下怎么在Qt代码中启动一个进程。【实例】【mainwindow.h】#include ,然后添加私有对象定义:QProcessmyProcess;private slots: void showResult();private: Ui::MainWindow *ui; QProcessmyProcess;在mainwindow.cpp文件中添加代码。
(1)先添加头文件包含:#include,然后在构造函数中添加如下代码:connect(&myProcess,SIGNAL(readyRead()),this, SLOT(showResult()));
(2)然后添加showResult()槽的定义:void MainWindow::showResult(){ QString str = QString(myProcess.readAll()); ui->textBrowser->setText(str);}
(3)最后将前面按钮的单击信号对应的槽更改为:void MainWindow::on_pushButton_clicked()
{
QString program = "cmd.exe";
QStringList arguments;
arguments << "/c dir&pause";
myProcess.start(program, arguments);
}
这里在启动Windows下的命令行提示符程序cmd.exe时为其提供了命令作为参数,这样可以直接执行该命令。当命令执行完以后可以执行showResult()槽来显示运行的结果。
本帖最后由 静水竹林 于 2016-9-26 09:28 编辑
传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应。这个问题可以用事件处理和多线程来解决。
【Qt多线程编程】QThread类提供了与系统无关的线程。 QThread代表在程序中一个单独的线程控制,在多任务操作系统中,它和同一进程中的其它线程共享数据,但运行起来就像一个单独的程序一样。它不是在main()中开始,QThread是在run()中开始运行的。继承run()并且在其中包含自定义的代码。
【实现方法】1. 子类化QThread2. 重新实现它的run()函数就可以了。run()是个纯虚函数,是线程执行的入口,在run()里出现的代码将会在另外线程中被执行。run()函数是通过start()函数来实现调用的。
【实例】【MyThread.h】
class MyThread : public QThread {
public:
void run();
};
【MyThread.cpp】
void MyThread::run()
{
for( int count = 0; count < 20; count++ ) {
sleep( 1 );
qDebug( "Ping!" );
}
}
【mywindows.cpp】
int main()
{
MyThread a;
MyThread b;
a.start();
b.start();
a.wait();
b.wait();
}
这将会开始两个线程,每个线程在屏幕上写20次“Ping!”并且退出。在main()的结尾调用wait()是必需的,因为main()的结束会终结整个程序,它会杀掉所有其它线程。
【信号量和互斥锁】Qt互斥锁QMutexQMutex类提供了一种保护一个变量和一段代码的方法。mutex.lock()//锁住互斥量(mutex)。如果互斥量是解锁的,那么当前线程就立即占用并锁定它。否则,当前线程就会被阻塞,知道掌握这个互斥量的线程对它解锁为止。mutex.unlock()//解锁mutex.tryLock()//尝试解锁,如果该互斥量已经锁住,它就会立即返回
Qt信号量QSemaphoreQt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
【Qt创建进程的方法】 在设计一个应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该功能与当前设计的应用程序联系不大,或者是因为该功能已经可以使用现成的程序很好的实现了,这时就可以在当前的应用程序中调用外部的程序来实现该功能,这就会使用到进程。Qt应用程序可以很容易的启动一个外部应用程序,而且Qt也提供了在多种进程间通信的方法。 Qt的QProcess类用来启动一个外部程序并与其进行通信。下面我们来看一下怎么在Qt代码中启动一个进程。
【实例】【mainwindow.h】#include
,然后添加私有对象定义:QProcessmyProcess;private slots: void showResult();private: Ui::MainWindow *ui; QProcessmyProcess;在mainwindow.cpp文件中添加代码。
(1)先添加头文件包含:#include,然后在构造函数中添加如下代码:connect(&myProcess,SIGNAL(readyRead()),this, SLOT(showResult()));
(2)然后添加showResult()槽的定义:void MainWindow::showResult(){ QString str = QString(myProcess.readAll()); ui->textBrowser->setText(str);}
(3)最后将前面按钮的单击信号对应的槽更改为:void MainWindow::on_pushButton_clicked()
{
QString program = "cmd.exe";
QStringList arguments;
arguments << "/c dir&pause";
myProcess.start(program, arguments);
}
这里在启动Windows下的命令行提示符程序cmd.exe时为其提供了命令作为参数,这样可以直接执行该命令。当命令执行完以后可以执行showResult()槽来显示运行的结果。
QThread类提供了与系统无关的线程。 QThread代表在程序中一个单独的线程控制,在多任务操作系统中,它和同一进程中的其它线程共享数据,但运行起来就像一个单独的程序一样。它不是在main()中开始,QThread是在run()中开始运行的。继承run()并且在其中包含自定义的代码。【实现方法】1. 子类化QThread2. 重新实现它的run()函数就可以了。run()是个纯虚函数,是线程执行的入口,在run()里出现的代码将会在另外线程中被执行。run()函数是通过start()函数来实现调用的。 【实例】【MyThread.h】
class MyThread : public QThread {
public:
void run();
};
【MyThread.cpp】
void MyThread::run()
{
for( int count = 0; count < 20; count++ ) {
sleep( 1 );
qDebug( "Ping!" );
}
}
【mywindows.cpp】
int main()
{
MyThread a;
MyThread b;
a.start();
b.start();
a.wait();
b.wait();
}
这将会开始两个线程,每个线程在屏幕上写20次“Ping!”并且退出。在main()的结尾调用wait()是必需的,因为main()的结束会终结整个程序,它会杀掉所有其它线程。【信号量和互斥锁】Qt互斥锁QMutexQMutex类提供了一种保护一个变量和一段代码的方法。mutex.lock()//锁住互斥量(mutex)。如果互斥量是解锁的,那么当前线程就立即占用并锁定它。否则,当前线程就会被阻塞,知道掌握这个互斥量的线程对它解锁为止。mutex.unlock()//解锁mutex.tryLock()//尝试解锁,如果该互斥量已经锁住,它就会立即返回
Qt信号量QSemaphoreQt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。
【Qt创建进程的方法】 在设计一个应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该功能与当前设计的应用程序联系不大,或者是因为该功能已经可以使用现成的程序很好的实现了,这时就可以在当前的应用程序中调用外部的程序来实现该功能,这就会使用到进程。Qt应用程序可以很容易的启动一个外部应用程序,而且Qt也提供了在多种进程间通信的方法。 Qt的QProcess类用来启动一个外部程序并与其进行通信。下面我们来看一下怎么在Qt代码中启动一个进程。【实例】【mainwindow.h】#include ,然后添加私有对象定义:QProcessmyProcess;private slots: void showResult();private: Ui::MainWindow *ui; QProcessmyProcess;在mainwindow.cpp文件中添加代码。
(1)先添加头文件包含:#include,然后在构造函数中添加如下代码:connect(&myProcess,SIGNAL(readyRead()),this, SLOT(showResult()));
(2)然后添加showResult()槽的定义:void MainWindow::showResult(){ QString str = QString(myProcess.readAll()); ui->textBrowser->setText(str);}
(3)最后将前面按钮的单击信号对应的槽更改为:void MainWindow::on_pushButton_clicked()
{
QString program = "cmd.exe";
QStringList arguments;
arguments << "/c dir&pause";
myProcess.start(program, arguments);
}
这里在启动Windows下的命令行提示符程序cmd.exe时为其提供了命令作为参数,这样可以直接执行该命令。当命令执行完以后可以执行showResult()槽来显示运行的结果。