zoukankan      html  css  js  c++  java
  • QT线程(一):线程类

     

        线程之间共享数据,但又单独执行;

        QT线程QThread是平台无关的;

        通常主线程从main开始执行,而在主线程中创建其他线程,其他线程派生于QThread;

     

    1、线程优先级

    总共8个优先级:线程优先级从上到下越来越高。

    Constant

    Value

    Description

    QThread::IdlePriority

    0

    scheduled only when no other threads are running.

    QThread::LowestPriority

    1

    scheduled less often than LowPriority.

    QThread::LowPriority

    2

    scheduled less often than NormalPriority.

    QThread::NormalPriority

    3

    the default priority of the operating system.

    QThread::HighPriority

    4

    scheduled more often than NormalPriority.

    QThread::HighestPriority

    5

    scheduled more often than HighPriority.

    QThread::TimeCriticalPriority

    6

    scheduled as often as possible.

    QThread::InheritPriority

    7

    use the same priority as the creating thread. This is the default.

     

     

    2、线程管理

    2.1、线程启动

    void

    start ( Priority priority = InheritPriority )

    启动线程执行,启动后会发出started信号。

     

     

     

     

        2.2、线程执行

    int

    exec ()

    进入线程eventloop。

     

    virtual void

    run ()

    线程入口。

      

        2.3、线程退出

     

    void

    quit ()

    相当于exit(0)。

     

    void

    exit ( int returnCode = 0 )

    调用exit后,thread将退出event loop,并从exec返回,exec的返回值就是returnCode。

    通常returnCode=0表示成功,其他值表示失败。

     

    void

    terminate ()

    结束线程,线程是否立即终止取决于操作系统。

    线程被终止时,所有等待该线程Finished的线程都将被唤醒。

    terminate是否调用取决于setTerminationEnabled ( bool enabled = true )开关。

     

     

    2.4、线程等待

    void

    msleep ( unsigned long msecs )

    void

    sleep ( unsigned long secs )

    void

    usleep ( unsigned long usecs )

    bool

    wait ( unsigned long time = ULONG_MAX )

    线程将会被阻塞,等待time毫秒。和sleep不同的是,如果线程退出,则wait会返回。

     

     

    2.4、线程状态

    bool

    isFinished () const

    线程是否已退出。

    bool

    isRunning () const

    线程是否还处于运行态。

     

    2.5、线程属性

    Priority

    priority () const

    void

    setPriority ( Priority priority )

    void

    setStackSize ( uint stackSize )

    uint

    stackSize () const

    void

    setTerminationEnabled ( bool enabled = true )

    设置是否响应terminate()。

     

    3、线程实例

           当我们创建线程时,首先是从QThread派生类定义一个新的线程,然后再使用该线程时,创建该线程类的对象。

           例如:

    class MyThread : public QThread 
    {
     protected:
         void run();                         /* 重载run */
     };
     
     void MyThread::run()
     {
         QTcpSocket socket;
         socket.connectToHost(hostName, portNumber);          /* 建立tcp连接 */
         exec();                                              /* 进入事件循环 */
     }
     
    int main()
    {
          MyThread thread;                   /* 使用新创建的thread */
          thread.start();                    /* thread会执行run(),建立tcp连接并进入事件循环,直到thread终止退出事件循环 */
          thread.wait();                     /* 等待thread退出 */
          return 0;
    }

           从QThread派生类时,需要重新实现QThread的虚函数run。

      void QThread::run () [virtual protected]

           该函数是线程的入口,当我们使用start()启动线程时,新线程就会执行run()。默认的run()函数就仅仅调用了exec()进入事件循环。

           当然,定义自己的线程run()时,也可以不使用事件循环,

    例如:

    class Thread : public QThread
    {
        Q_OBJECT
    public:
        Thread();
     
        void setMessage(const QString &message);
        void stop();
     
    protected:
        void run();
     
    private:
        QString messageStr;
        volatile bool stopped;
    };
     
    Thread::Thread()
    {
        stopped = false;
    }
    void Thread::run()
    {
        while (!stopped)                                               /* 该thread就没有用到exec()进入事件循环 */
            std::cerr << qPrintable(messageStr);
        stopped = false;
        std::cerr << std::endl;
    }
    void Thread::stop()
    {
        stopped = true;
    }
  • 相关阅读:
    洛谷p1017 进制转换(2000noip提高组)
    Personal Training of RDC
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Eurasia
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Peterhof.
    Asia Hong Kong Regional Contest 2019
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia
    XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix.
    XVIII Open Cup named after E.V. Pankratiev. GP of SPb
    卜题仓库
    2014 ACM-ICPC Vietnam National First Round
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3944159.html
Copyright © 2011-2022 走看看