2017-11-01 34 views
0

私はWt C++フレームワークを使用しており、クラス機能を持つプッシュボタンを接続する必要があります。以下のコードはうまく動作しますが、スレッドの関数doors_open_allを実行して、同時に他のアクションを使用できるようにする必要があります。std :: threadでboost :: bindを使う方法(Wt C++で)

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)); 
+1

'Servicemode :: doors_open_all()'関数内で新しいスレッドを起動することはできませんか? – Galik

+0

どうやら、このような方法で非静的メンバー関数を使用することはできません。 – Levi

+1

'Servicemode :: doors_open_all()'の中にスレッドを起動して、必要に応じてラムダ関数を与えることができます。しかし、実際には、スレッド内で非静的メンバー関数を実行することもできます。 – Galik

答えて

0

私はcorrently質問を理解している場合は、新しいスレッドでdoors_open_all機能を実行する必要があります。

boost::threadコンストラクタは内部で使用していますboost::bind明示的に指定する必要はありません。

だからopen_doors_button->clicked().connect(boost:: thread(&Servicemode::doors_open_all, this));は仕事をする必要があります。

boost::threadboost::bindとバージョン: open_doors_button->clicked().connect(boost::thread(boost::bind(&Servicemode::doors_open_all, this)));

編集: あなたは、あまりにもこのpurpouseためstd::asyncを使用して試すことができます。

+0

提案していただきありがとうございますが、boost :: thread(bindも)は削除された関数エラーを返します: 'エラー:削除された関数の使用' boost :: thread :: thread(const boost :: thread&) ' – Levi

0

Servicemode::doors_open_all()は何をしますか?

長い時間がかかっているのはすべてバックエンドのものだと仮定すると、ウィジェットは作成、削除、または変更されていないので、Servicemode::doors_open_all()のスレッドを作成してそのバックエンドのすべてを処理できます。それはそのUIを更新し、あなたの作成のすべてを行う、削除、変更する必要があるアプリケーションに通知するために、それをあなたのWApplicationのセッションIDと機能を渡し、使用WServer::post()

  1. :あなたが二つの可能性を持って行っていた場合そのコールバックのウィジェットの
  2. グラブWApplicationの更新ロック:

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

    あなたは更新ロックを持っている場合は、あなたが先に行くと、ウィジェットツリーを変更することができます。これを行う際にどのような場合には

は、あなたはまた、これらの2つのことを実行する必要があります。

  1. app->enableUpdates(true)を呼び出すことによって、事前にサーバープッシュを有効にします。スレッドが完了すると、app->enableUpdates(false)でサーバープッシュを再び無効にすることができます。
  2. ウィジェットツリーを変更したら、これらの変更をクライアントにapp->triggerUpdate()でプッシュする必要があることをWtに通知します。何に長い時間を要することはUI関連のであれば重量はあなたが持っているときにのみ、すなわち一度に単一のスレッドからWApplicationとそのウィジェットを変更することを前提としているので

、そして、あなたが行うことができますあまりありません更新ロック。 WPushButton::clicked()のように、クライアントからのイベントを処理するときに常に更新ロックが自動的に取得されます。

サーバプッシュは、serverpushの例で示されています。あなたはWtソースツリーのexamples/feature/serverpushの下にそれを見つけることができます。

関連する問題