2017-08-16 3 views
2

UWPアプリケーションでstd::threadを使用してスレッドを作成するにはどうすればよいですか?申し訳ありませんが、オブジェクト内のメンバー関数のスレッドを作成するために必要な構文に問題があります。私はVisual StudioでC++/cxを使い始めました。ここに私のコードは次のとおりです。UWPでオブジェクトのメンバ関数内でstd :: threadを使用する方法C++/CX

void MainPage::increment(int val) 
{ 
    for (int i = 0; i < val; ++i){ 
     m_timer4++; 
     Sleep(100); 
     textBox4->Text = m_timer4.ToString(); 
    } 
} 

void _4ThreadsUWP::MainPage::button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    m_timer->Start(); 
    std::thread th(&MainPage::increment, this, 5); 
} 

EDIT:

私はこれらのエラーを持っています:

ERROR1:

'std::invoke': no matching overloaded function found 

誤差2:

Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)' 
+0

スレッドオブジェクトは、作成直後に有効範囲外になります。あなたはそれを 'th.join();'に参加させておくべきです。 – Azeem

+0

@Azeemでも、私は 'th.join()を追加しましたが、それでも問題は解決しません。提案してくれたことありがとう – Gibs

+2

私はずっと前に 'bind'スタイルの構文をあきらめました。ちょうどlambda:' std :: thread th([this]> increment(5);}); 'を使います。 –

答えて

2

私はしないでくださいあなたの同僚と何が間違っているのかを正確にnstructorの呼び出し - バインドスタイルの構文は非常に気に入っており、最悪のエラーメッセージが出ます。

私の提案は、std::bindとその不潔な兄弟(このstd::threadコンストラクタなど)をすべて避け、できるだけラムダ関数を使用することです。彼らは独自の癖を持っていますが、一般的に理解しやすいものですが、エラーメッセージは完全なガベージではなく、もっとアプリケーションがあります。この場合

、あなただけ行うことができます。

std::thread th([this]{this->increment(5);}); 

言われて、あなたのコードは、複数のレベルに論理的に間違っています。 std::threadは、スレッドが終了するか、作成したスレッドをスレッドから明示的に切り離すまで破棄したくないため、例外が発生する可能性があります。オブジェクト。だから:今、あなたのメインスレッドはワーカースレッドを待って立ち往生されるように

  • あなたがjoinを呼び出すのいずれか、この場合には、意味をなさないことになるので、スレッドを起動すると、最初の場所で無用です。
  • またはdetachです。これは暴走スレッドを持つことができるため、悪いことです。アプリケーションウィンドウを閉じると、破棄されているデータで動作しているスレッドがまだ実行されている可能性があります。

より良い解決策は、クラスレベルでワーカースレッドを移動し、ボタンをクリックしてウィンドウを閉じるときに開始します(まだ開始していない場合)。

しかし:このすべては、GUIはスレッドセーフではありませんオブジェクト(UWPを含む)のほぼすべてのGUIツールキット以来、とにかく無用です。メインのUIスレッドではないスレッドからメソッドを呼び出すと、動作が異常になり、クラッシュすることがあります。

安全なクロススレッドGUIコール(GUIイベントキューを介してメッセージを渡すことが一般的である)を行う方法があります。this articleにはUWP関連の提案がいくつかありますが、砲弾で蚊を撃ったようなものです。あなたの場合に必要なのは、スレッドがまったくない通常のタイマーだけです。

関連する問題