Qt中线程与进程实现总结

  • 静水竹林
  • LV5工程师
  • |      2016-09-26 09:27:17
  • 浏览量 522
  • 回复:0
本帖最后由 静水竹林 于 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()槽来显示运行的结果。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子