2012-01-29 8 views
2

私は2つの異なるスレッドを持っています。最初のものはGUI操作を処理する必要があるメインスレッドです。 2番目は関連するtcpポートをリッスンするネットワークスレッドです。彼らはメインスレッドで実行される方法でメソッドを呼び出すネットワークスレッドが必要です。どのように私はメッセージキューのメカニズムを使用せずにこれを達成することができますか?メインスレッドで動作するメソッドを呼び出す

+1

メッセージキューなしで別のスレッド*でイベントを生成する方法と、メッセージキューを使用しない理由は何でしょうか。 – Thanatos

+0

何とかメソッドを呼び出すためにメインスレッドに信号を送る必要があります。あなたがGUI操作をしていないときにGUIスレッドは何をしますか?それは何を待っていますか? –

+0

メインスレッドは3Dグラフィックス更新メソッドを実行します。したがって、ネットワークメッセージがメインスレッドの下で処理されないようにするため、グラフィックスのパフォーマンスを低下させる可能性があります。 – Alican

答えて

3

私はあなたのケースでそれを行う方法は、イベントキューに関数をスケジュールするように他のスレッドに伝えることです。その関数への引数は、送信される関数にバインドされています。ネットワークコードの例について同様

int result = doWork(); 
otherThreadsEventLoop.scheduleFunction(drawResult,result); 

すべてのGUIフレームワークとほとんどのネットワークフレームワークは、あなたがそれを行うことができます。

  • qtを使用している場合は、QMetaObject :: invokeMethodを使用します。
  • gtkを使用している場合は、q_idle_addを使用します。
  • boost :: asioを使用している場合は、io_service.postを使用します。
  • libeventを使用している場合は、event_base_onceを使用します。

Cのコールバックだけを提供するライブラリの追加パラメータのバインディングが1つの問題かもしれません。私の提案は、あなたがstd ::関数をコールバックに渡せるようにする "ラッパー"関数を書くことです。

2

メインスレッドで実行中のコードに対して、メソッドを呼び出す必要があることを伝える必要があります。これをどのように実装しても、基本的に何らかのメッセージキューがあります。実際の要件をより具体的に把握して、ケースに適したメッセージキューメカニズムを提案する必要があります。

関連する問題