簡體   English   中英

如何將boost :: bind與std :: thread結合使用(在Wt C ++中)

[英]how to use boost::bind with std::thread (in Wt c++)

我正在使用Wt C ++框架,需要將按鈕與類函數連接。 下面的代碼可以正常工作,但是需要在線程上運行功能doors_open_all以允許同時使用其他操作。

Wt::WPushButton *open_doors_button = new Wt::WPushButton("open all");
container_box->addWidget(open_doors_button);
open_doors_button->clicked().connect(boost::bind(&Servicemode::doors_open_all, this));

需要遵循以下原則:

open_doors_button->clicked().connect(boost::threaded_bind(&Servicemode::doors_open_all, this));

如果我正確理解問題,則需要在新線程中運行doors_open_all函數。

boost::thread構造函數是內部使用boost::bind您無需明確。

所以open_doors_button->clicked().connect(boost:: thread(&Servicemode::doors_open_all, this)); 應該做的工作。

帶有boost::threadboost::bindopen_doors_button->clicked().connect(boost::thread(boost::bind(&Servicemode::doors_open_all, this)));

編輯:您也可以為此目的使用std::async

Servicemode::doors_open_all()什么作用?

如果我假設花費很長時間只是所有后端的東西,那么就沒有創建,刪除或修改任何小部件,那么您可以在Servicemode::doors_open_all()內部產生一個線程來執行所有這些后端的東西。 完成后,您有兩種可能性:

  1. 使用WServer::post() ,向其傳遞WApplication的會話ID和一個函數,以通知應用程序它應該更新其UI,並執行該回調中所有小部件的創建,刪除和修改。
  2. 抓住WApplication的更新鎖:

     // Assuming that app is a Wt::WApplication* Wt::WApplication::UpdateLock lock(app); // lock is released when it goes out of scope 

    擁有更新鎖后,您可以繼續修改窗口小部件樹。

無論如何,在執行此操作時,您還必須執行以下兩項操作:

  1. 通過調用app->enableUpdates(true)預先啟用服務器推送。 線程完成后,您可以再次使用app->enableUpdates(false)禁用服務器推送。
  2. 修改小部件樹后,通知Wt它應使用app->triggerUpdate()將這些更改推送到客戶端。

如果花費很長時間與UI相關,那么您將無能為力,因為Wt假設您一次只能從一個線程(即,當您擁有更新鎖時)修改WApplication及其窗口小部件。 處理來自客戶端的事件(例如WPushButton::clicked()時,總是會自動抓住更新鎖。

服務器推送演示了serverpush例子。 您可以在Wt源代碼樹的examples/feature/serverpush下找到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM