1

初学者的问题,但实际上我被卡住了。我不允许使用“高级”c++ 线程函数(也不是 pthread,也不是 QThread)。但是,我应该使用 winAPI 函数 createThread 创建一些线程。那些线程用来改变一些变量。我想在 QLineEdit 组件中每 1 秒显示一次这些变量。所以我尝试了如下代码:

    stillWorking = true;
    while(stillWorking){
        ui->editElement->setText(QString::number(getVariableValue()));
        qDebug() << 'running!!!'
        Sleep(1000);
    }

stillWorking布尔值设置false为单击某个按钮时。这就是我希望停止这个循环的方式。但是,当我执行代码时,editElement没有更新,应用程序停止响应。但是,该'running!!!'字符串每秒都会在调试部分很好地打印出来。那么,还有其他方法可以访问和显示我的变量吗?

4

2 回答 2

3

你应该使用 a QTimer,假设你被允许(即使你被允许使用线程)。在 UI 线程上做任何类型的阻塞都不起作用,它需要被释放才能让事件处理工作,并且对点击做出反应需要事件处理。

计时器页面有更多信息和如何使用它的示例。这里的想法是创建一个简单的插槽:

ui->editElement->setText(QString::number(getVariableValue()));

和一个连接到该插槽的重复计时器。

(这假设getVariableValue()已正确同步,并且确实看到了来自该其他线程的更新值。)

于 2012-11-18T20:08:59.050 回答
0

您可以使用这两种方式中的任何一种;

第一个是上面从 Mat 解释的

第二种方法是如果你的类派生自 QObject,你可以覆盖 timerEvent

class MyObject : public QObject
{
    Q_OBJECT

public:
    MyObject(QObject *parent = 0);

int timerID;


protected:
    void timerEvent(QTimerEvent *event);
};

MyObject::MyObject(QObject *parent)
    : QObject(parent)
{

    timerID = startTimer(1000);   // 1-second timer

}

void MyObject::timerEvent(QTimerEvent *event)
{

    ui->editElement->setText(QString::number(getVariableValue()));

    this->killTimer(timerID); // you can use here if you plan stop timer

}

在您的函数中,如果 while 循环中断,您的可见小部件将更新,否则您的应用程序可以工作,但在循环过程中不更新任何 gui 小部件。

于 2016-04-08T22:17:52.300 回答