2016-09-01 7 views
1

Я новичок в wt и просто начал добавлять веб-интерфейс в программу lagacy C++. Пример hello_world отлично работает.Как обновить веб-страницу после создания в wt (C++)

Однако приведенные примеры касаются создания веб-страницы, и страница может реагировать на события с веб-страницы (т. Е. Кнопку, галочку), я хочу изменить веб-страницу ПОСЛЕ начала сеанса. Похоже, что HMI реагирует на изменения данных, вместо кнопок с веб-страницы.

Это должно быть выполнимо, так как вес документ говорит: Фактическая обработка запроса и предоставление отвлекаются, с таким преимуществом, что может быть использована модель полной страницы рендеринга (простой HTML) или добавочные обновления (Ajax/WebSockets) в зависимости от конфигурации и свойств браузера.

добавить метод "UPDATETEXT" в hello_world:

class HelloApplication : public WApplication 
{ 
public: 
    HelloApplication(const WEnvironment& env); 
    void updateText(std::string value); // I add this and rest are from helloworld 
private: 
    WLineEdit *nameEdit_; 
    WText *greeting_; 
    void greet(); 
}; 

Вот реализация:

HelloApplication::HelloApplication(const WEnvironment& env) 
: WApplication(env) 
{ 
    setTitle("Trading Platform Status");        // application title 

    root()->addWidget(new WText("Starting... ")); // show some text 
    nameEdit_ = new WLineEdit(root());      // allow text input 
    nameEdit_->setFocus();         // give focus 

    WPushButton *button 
     = new WPushButton("Greet me.", root());    // create a button 
    button->setMargin(5, Left);       // add 5 pixels margin 

    root()->addWidget(new WBreak());      // insert a line break 

    greeting_ = new WText(root());       // empty text 


    /* Connect signals with slots - simple Wt-way*/ 
    button->clicked().connect(this, &HelloApplication::greet); 

    /* using an arbitrary function object (binding values with boost::bind())*/ 
    nameEdit_->enterPressed().connect 
     (boost::bind(&HelloApplication::greet, this)) 
} 

void HelloApplication::greet() { 
    /*Update the text, using text input into the nameEdit_ field.*/ 
    greeting_->setText("Hello there, " + nameEdit_->text()); 
} 

Greet() от оригинального HelloWorld, и я добавляю метод UPDATETEXT.

void HelloApplication::updateText(std::string value) 
{ 
    /* 
    * Update the text, using text input into the nameEdit_ field. 
    */ 
    greeting_->setText(value); 
} 

WApplication *createApplication(const WEnvironment& env) 
{ 
    /* 
    * You could read information from the environment to decide whether 
    * the user has permission to start a new application 
    */ 
    return new HelloApplication(env); 
} 

В основном я запускаю хост в отдельной теме.

руководство указал:

Во все времена экземпляр WApplication доступен с помощью статического метода WApplication :: экземпляра(), и полезно проверять аргументы и параметры запуска (с помощью WApplication :: среды()), чтобы установить или изменить заголовок приложения (WApplication :: setTitle()), чтобы указать локаль (WApplication :: setLocale()) для рендеринга и многие другие параметры приложения. В многопоточной среде доступ к этому экземпляру реализуется с использованием локального хранилища потоков.

int main(int argc, char* argv[]) 
{ 
    //start in new thread or it blocks the following work 
    thread website_thread(&WRun,argc, argv, &createApplication); 
    //balabalabala some work 
    ((HelloApplication*)WApplication::instance())->updateText("Finished"); 
    //balabala more work 
    return 0 
} 

UPDATETEXT терпит неудачу, потому что "это" является нулевым. Очевидно, что это не правильный способ выполнить задачу. Какие-либо предложения?

+0

Вы должны посмотреть на некоторые примеры программ - в этом вопросе, по-видимому, много вопросов и недоразумений. Построение образцов действительно является вашим следующим шагом. –

ответ

1

Вам нужно:

  • сохранить список сессий вы хотите, чтобы сигнализировать, например, путем размещения объектов WApplication в глобальном списке при создании WApplication и удалении его в деструкторе. Вы также можете сделать это более мелкозернистым.
  • enable server push для каждого приложения, которое может быть обновлено серверным событием (просто вызовите WApplication :: enableUpdates())
  • убедитесь, что дерево виджета заблокировано, когда вы модифицируете его на стороне сервера, либо захват WApplication :: updateLock или использование WServer :: post() для публикации выполнения функции в контексте сеанса
  • вызов WApplication :: triggerUpdate(), когда дерево виджета было изменено, так что изменения будет перенаправлен клиенту

Кроме того, вы можете включить поддержку веб-карт в файле wt_config.xml.

Простой пример демонстрирует почти все это.

WApplication :: instance использует поточно-локальное хранилище, которое устанавливается Wt, когда поток назначается для обработки объекта сеанса, поэтому нормально, что он возвращает null в вашем основном потоке.