2017-11-10 13 views
0

[編集]をクリックし、ボタンの後にウィンドウがunclickableます 関数を呼び出すWPushButtonクリック:重量C++

button->clicked(boost::bind(&Service::burn, this)); 

どのように1回の凍結することができます重量(バージョン3)C++フレームワークを使用して

以下のソリューションスクリーン(またはすべてのボタン)は、そのような方法で、関数が実行されている間は何もクリックできない(かなり長い時間実行される)。現在、Service :: burn()関数が実行されているときに、Service :: burn()関数の終了後にキューに入れられて実行される他のボタンをクリックできます。

フリーズ後にすべてのボタン/画面を復元する必要があることに注意してください。また、機能があります:

ソリューション:

​​

答えて

1

これは動作するはずです:

button->clicked(button, &WPushButton::disable); 
button->clicked(boost::bind(&Service::burn, this)); 

だから、あなたが最初のハンドラを使用してUIを無効にした後、第2 1を使用して、重い、長いプロセスを起動します。

これらの2つのハンドラを1回の呼び出しで使用すると、その呼び出しが終了するまでUI変更がブラウザに伝播しないため、これらのハンドラは機能しません。

+0

ありがとうございました、それはdoesnの呼び出し&WPushButton ::後&サービス::バーンコールを有効にするが、働いていましたそれを有効にしているように見えますが、それは何の不具合もなくしていますか? – Levi

+0

'Service :: burn'はシングルスレッド内で実行されていますか?内部で 'WPushButton :: Enable'を呼び出しますか? – hank

+0

はい、1つのスレッド内で実行されます。関数と外部の両方でWPushButton :: enableを呼び出そうとしましたが、効果がありません。 – Levi

0

イベント処理が完了するまで、Witはブラウザにウィジェットツリーの変更を送信しません。これは、some_long_funcが完了するまで効果pfボタンの無効が表示されないことを意味します。

これを回避する方法の1つは、ボタンを無効にしてからsome_long_funcを呼び出す前にwApp-> processEvents()を呼び出すことです。これにより、ウィジェットツリーの中間更新がブラウザに直ちに送信されます。ボタンは、ハンドラは、このように(信号利きの実行順序を保証するために、一の機能として)このようになります)(クリック:

{ 
    spec_button->disable(); 
    wApp->processEvents(); 
    some_long_func(); 
} 
関連する問題