2012-02-12 14 views
4

例えば、私はメインスレッドを持っています、クラスなどがたくさん作成されています。私は別のスレッドでクライアントデータを待つネットワーク部分を持っています。この「ウェイター」は、メインスレッドで作成されたクラスからいくつかの関数を実行する必要があり、この関数はメインスレッドで実行する必要があります。C++でメインスレッドの関数をセカンダリスレッドで実行している関数から実行することはできますか?

どうすればいいですか?私が必要としている方法をこのように呼び出すなら、ウェイターからのSomeClass::SomeMethod(some_args);、彼らはセカンダリスレッドで実行されます。

このようなものがありますか? SomeClass::Invoke(function_pointer);ですから、function_pointerがポイントする機能はメインスレッドで実行されますか?私はWindows OSのアドバイスが必要です。

+0

どのスレッドが機能を実行するのが重要かを明確にすることはできますか?最良の方法は、あなたが解決しようとしている問題が何であるかに大きく依存します。 –

+0

よく、この機能のいくつかは非常に長く実行され、ネットワーク部分が次のパケットをしばらく処理することができません。
3番目のスレッドでこの機能を起動すると、多くのスレッドが実行され、リスト、配列などで奇妙なことが起きるため、デバッグが難しくなります。\ n \ rこのコメントを送信します)
メインスレッドでこの関数を実行するようにprefferします – Kosmos

+0

あなたのコードでバグを検出するのが簡単になるほど、デバッグが容易になります。コードの並行性を高めると、バグがクラッシュする可能性が高くなり、バグの発見と修正にかかる時間が短縮されます。 –

答えて

6

これがWindowsのWin32アプリケーションの場合、アプリケーションのメッセージ処理キューを使用するのが一般的なアプローチです。コンソールアプリケーションの場合

(in header file) 
#define WM_MYCUSTOMMESSAGE (WM_USER + 1) 

(WndProc for you main window) 
LRESULT WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
    case WM_MYCUSTOMMESSAGE: 
     ... Process something 
     break; 
    } 
} 

(On seconday thread) 
SendMessage(hWnd, WM_MYCUSOMMESSAGE, wParam, lParam); // Send and wait for the result 

PostMessage(hWnd, WM_MYCUSTOMMESSAGE, wParam, lParam); // Send the message and continue this thread. 

[EDIT] 、Windowsのイベントを使用してみてください:あなたは、カスタム・ユーザー・メッセージを待つのアプリのメインウィンドウで は、一般的にそれが何かのようになります。したがって、名前付きイベントを作成するには、次のようにしてください。

(On primary thread) 
HANDLE myEvent = CreateEvent(NULL, FALSE, FALSE, "MyEvent"); 

... later as part of a message processing loop 
while(true) 
{ 
    WaitForSingleObject(myEvent, 0); // Block until event is triggers in secondary thread 

    ... process messages here 
    ... I recommend storing "messages" in a synchronized queue 
} 

(On secondary thread) 
SetEvent(myEvent); // Triggers the event on the main thread. 
+0

残念なことに質問申し訳ありませんが、これがコンソールアプリケーションの場合はどうすればよいですか? – Kosmos

+0

akhispはちょうど完全な答え、ちょっとしたボーナスを与えたいと思っています。それは間違っていません。 私はメッセージを送信する方法が好きです。このメソッドをUIに干渉する関数を呼び出す必要があるインラインフックアプリケーションに適用しました。 +1してください。 –

2

呼び出されたとしても、関数は呼び出されたスレッドで実行されるため、使用しません。

セカンダリスレッドで解放されたメインスレッドでループ内にビジー待機またはミューテックスを持つことができます。解放されると、3変数の値に応じていくつかのメソッドが呼び出されます。

//thread1 
runThread2(); 
while (true) 
{ 
    mutex.acquire(); 
    mutex.lock(); 
    switch(command) 
    { 
     case command_noop: 
     sleep(1000); 
     break; 
     case command1: 
     foo1(); 
     break; 
     case command2: 
     foo2(); 
     break; 
     //and so on... 
    } 
    mutex.release(); 
} 

//thread2: 
mutex.lock(); 
//commands 
command = 1; 
mutex.release(); 
mutex.acquire(); 
//rest of commands 
+0

なぜdownvote? –

+0

私は知らない。私は – Kosmos

+0

ちょっと私のために使用するのは難しい投票に十分なrepポイントがありません。少なくともそれはうまくいくはずです。ありがとう! – Kosmos

関連する問題