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;
    }
  • 相关阅读:
    Java序列化的机制和原理
    范型练习
    Java范型
    Hadoop之HelloWorld
    IEnumerable和IEnumerator
    浅谈静态变量和类
    MVC中的Startup.Auth.cs、BundleConfig.cs、FilterConfig.cs和RouteConfig.cs
    "ApplicationDbContext"(泛指之类的数据库上下文模型)上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库。
    C#.NET的微信功能开发学习
    本地Fiddler传递XML格式数据,调试微信功能。
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3944159.html
Copyright © 2011-2022 走看看