繁体   English   中英

WT小部件未在Boost线程中更新

[英]WT widget not updating in boost thread

我遇到了WT的一个有趣的问题,已经解决了,但是我不明白为什么我的解决方案可以解决问题。 我已经浏览了WT文档的小部件,并且到目前为止空手而归,所以也许对WT了解更多的人可以在这里帮助我。

无论如何,问题在于boost线程中的WComboBox小部件在单击并更改其选择时未更新其数据。

我在课堂上创建了一个增强线程

    class MyConsole: public WApplication
    {
    private:
    boost::shared_ptr<boost::thread> _thread;
    WComboBox* _combo_box;
    bool running;

    //Thread function
    void my_thread(Wt::WApplication *app);
    }

然后,用数据填充组合框,让我们使用“ foo”和“ goya”作为2个条目。 我为线程创建了一个函数,并在其中放入了一个循环。

    void MyConsole::my_thread(Wt::WApplication *app)
    {
     while(running)
     {
      std::string test;
      Wt::WApplication::UpdateLock lock(app);
      if(lock)
      {
       test = _combo_box->valueText().narrow();
      }
      if (strcmp("foo", test.c_str()) == 0)
      {
        cout << "we got foo" << endl;
      }
      else if (strcmp("goya", test.c_str()) == 0)
      {
        cout << "we got goya" << endl;
      }
     }
    }

在不更改组合框的初始选择的情况下,上面的代码始终输入foo if语句,这是预期的。 但是,当我将_combo_box的选择更改为“ goya”时,上面的代码仍然输入“ foo” if语句,这是非常意外的。 进一步调查该问题,例如在if语句向我表明它始终为0且选择更改时永远不会递增之前打印出组合框的当前索引。

我修复它的方法是将组合框changed()信号连接到我添加到该类的“不执行任何操作”功能。

    class MyConsole: public WApplication
    {
    private:
    ...
    void WWidgetForceUpdate(void)
    {

    }
    ...
    }
    ...
    _combo_box->changed().connect(this, &MyConsole::WWidgetForceUpdate);

通过在选择更改时添加该函数调用,“ foo”和“ goya” if语句可以正常工作,并在if语句确认索引正在更改之前打印出组合框的当前索引。

为什么将changed()信号连接到“无作用”功能可以解决这种情况? 我确信这里还有一个更大的问题,我没有看到:(任何帮助将不胜感激。

事件发生时,Wt将更改从浏览器发送到服务器。 如果您的程序对某个事件不感兴趣,则将不会进行此同步(否则,将在您在输入框中输入的每个文本字符,每个手势动作上进行同步...,即使您的应用程序没有执行此操作)任何东西)。 没有任何连接到changed()意味着对该特定事件没有任何兴趣,并且浏览器不会在事件发生时通知服务器。

任何正在侦听的事件都会将所有窗口小部件的所有更改发送到服务器,以便同步整个窗口小部件树。 因此,如果您有一个带有clicked()侦听器的按钮,以及一个没有更改()侦听器的组合框,则当您单击该按钮时,组合框的状态仍将在小部件树中更新。

但是,您的代码中存在一个错误:您不能仅从随机线程访问窗口小部件树而不获取更新锁(WApplication :: UpdateLock)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM