【问题标题】:Application->Processmessages in QT?QT 中的应用程序-> 进程消息?
【发布时间】:2012-06-24 09:54:32
【问题描述】:

在 Borland 6 中,我经常使用它来解除程序操作:

Application->Processmessages();

现在,使用 QT 4.8.1,我没有在这个外国(对我而言)QT 文档中找到。

谁能帮帮我?

【问题讨论】:

    标签: c++ qt c++builder


    【解决方案1】:

    在 Qt 中,您将使用静态函数 QApplication::processEvents()

    唉,你的问题是你的代码设计被破坏了。您永远不需要调用processEvents 来简单地“解开”事情。您的所有 GUI 代码都应该由运行到完成的方法组成,这些方法需要很短的时间(大约单毫秒:~0.001s)。如果某些事情需要更长的时间,则必须将其拆分为更小的部分,并在处理完每个部分后将控制权返回给事件循环。

    这是一个例子:

    class Worker: public QObject
    {
      Q_OBJECT
      int longWorkCounter;
      QTimer workTimer;
    public:
      Worker() : ... longWorkCounter(0) ... {
        connect(workTimer, SIGNAL(timeout()), SLOT(longWork());
      }
    public slots:
      void startLongWork() {
        if (! longWorkCounter) {
          workTimer.start(0);
        }
      }
    private slots:
      void longWork() {
        if (longWorkCounter++ < longWorkCount) {
          // do a piece of work
        } else {
          longWorkCounter = 0;
          workTimer.stop();
        }
      }
    };
    

    零持续时间计时器是每次事件队列为空时调用代码的一种方法。

    如果您正在调用第三方阻塞库代码,那么唯一(不幸的)解决方法是将这些操作放入 QObject 的槽中,并将该 QObject 移动到工作线程。

    【讨论】:

    • 同样的建议也适用于 Borland 6 代码。任何阻塞 UI 线程超过几(毫秒)秒的代码都应该重写以使用异步队列或工作线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多