【问题标题】:Symbian qt threadingSymbian qt 线程
【发布时间】:2010-04-14 20:03:20
【问题描述】:

1) 不推荐在 symbian c++ 线程中使用。取而代之的是,他们建议使用活动对象进行多任务处理。目前我正在使用 QT 在 symbian 中开发应用程序。由于 QT 中没有活动对象,我想到了使用线程。我的问题是,我可以使用线程,是否推荐。如果不推荐,如何实现多任务。

2) 我创建了一个示例线程类,如下所示。当我从主窗口的构造函数调用测试函数时,线程将启动但 UI 将处于挂起状态,实际上主窗口本身不会显示。 请帮我解决问题。

class CSampleThread: public QThread

{
    Q_OBJECT

public:
    CSampleThread(QObject *parent = 0) : QThread(parent)
    {}

    virtual ~CSampleThread()
    {}

    void test(){
        QThread::start(LowPriority);
    }

protected:

    void run()
{
    while(true){}

    }
};

【问题讨论】:

    标签: multithreading qt symbian


    【解决方案1】:

    可能是“while(true)”正在使主线程饿死 CPU 周期。尝试在循环体中添加对 yield() 或 sleep() 的调用。

    【讨论】:

    • 是的,我添加了 sleep(1000);在while循环中。它可以显示 UI。让我们考虑一下,如果我们有一个没有 sleep 和 yield 的循环,那么它会挂起。那么操作系统不负责上下文切换。
    【解决方案2】:

    您说得对,对于大多数 Symbian C++ 程序的开发,使用协作式多任务(也称为主动对象)优于抢先式多任务(即线程)。但是,当异步操作可能需要很长时间时,最好在单独的线程中执行它。虽然可以使用活动对象实现长时间运行的操作,但这样做可能会导致应用程序变得无响应,因为活动调度程序在执行长时间运行的 RunL() 函数时将无法处理输入事件。

    同样,在 Qt 中,仅当您的应用程序需要执行长时间运行的任务时才需要使用线程。在原生 Symbian 代码中使用 AO 处理的事件处理由 Qt 的事件系统负责,通过信号和插槽传递异步通知。不出所料,Symbian 上的 Qt 事件循环是使用活动对象实现的。

    因此,虽然我们可以提供 QThread 使用方面的帮助,但这是否是正确的解决方案取决于您要解决的问题的性质。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      相关资源
      最近更新 更多