[英]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::thread
和boost::bind
: open_doors_button->clicked().connect(boost::thread(boost::bind(&Servicemode::doors_open_all, this)));
編輯:您也可以為此目的使用std::async
。
Servicemode::doors_open_all()
什么作用?
如果我假設花費很長時間只是所有后端的東西,那么就沒有創建,刪除或修改任何小部件,那么您可以在Servicemode::doors_open_all()
內部產生一個線程來執行所有這些后端的東西。 完成后,您有兩種可能性:
WServer::post()
,向其傳遞WApplication
的會話ID和一個函數,以通知應用程序它應該更新其UI,並執行該回調中所有小部件的創建,刪除和修改。 抓住WApplication
的更新鎖:
// Assuming that app is a Wt::WApplication* Wt::WApplication::UpdateLock lock(app); // lock is released when it goes out of scope
擁有更新鎖后,您可以繼續修改窗口小部件樹。
無論如何,在執行此操作時,您還必須執行以下兩項操作:
app->enableUpdates(true)
預先啟用服務器推送。 線程完成后,您可以再次使用app->enableUpdates(false)
禁用服務器推送。 app->triggerUpdate()
將這些更改推送到客戶端。 如果花費很長時間與UI相關,那么您將無能為力,因為Wt假設您一次只能從一個線程(即,當您擁有更新鎖時)修改WApplication
及其窗口小部件。 處理來自客戶端的事件(例如WPushButton::clicked()
時,總是會自動抓住更新鎖。
服務器推送演示了serverpush
例子。 您可以在Wt源代碼樹的examples/feature/serverpush
下找到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.