• 締切済み

_beginthreadとPostThreadMessageについて

C言語の_beginthreadとPostThreadMessageについて質問いたします。 main関数内で_beginthread関数でスレッドを二つ生成し、 PostThreadMessageでメッセージを送信してみるとなぜか1番目のスレッドは失敗し、2番目のスレッドは成功します。 1番目のスレッドにPostThreadMessageした場合のGetLaseErrorで取得しらエラーは1159(メッセージは同期した操作とのみ使用できます。)になっています。 理由がまったくわからないです。orz。。。 何か情報があれば教えていただけますでしょうか?

みんなの回答

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.1

連続して送って二番目ということでしょうか。 或いは常に thread A は失敗、 thrad B は成功でしょうか。 thread C を生成し送ったらどうなりましたか。 ほんとうに片方では成功してますか。 メッセージは WM_USER より大きくしてますか。 >同期した操作とのみ使用 落ち着いてください。 と書こうと思ったらなんと大元の誤植ですね。

skflpoor
質問者

お礼

ご回答ありがとうございます。 >メッセージは WM_USER より大きくしてますか。 →この内容を適用させたらうまくいきました。 本当にありがとうございます。

関連するQ&A

  • _beginthread()の使用について

    元々スレッドの生成を CreateThread(NULL, 0, ThreadFunc, (LPVOID)&param, 0, &dwID); としていたのですが、 生成したスレッドがC言語のライブラリを利用する場合、 CreateThread()ではなく_beginthread()を使うとMSDNに記載されていました。 そこでプログラムを_beginthread()に書き換えたのですが、 『error C2440: '関数' : 'DWORD (__stdcall *)(LPVOID)' から 'void (__cdecl *)(void *)' に変換できません。』 『warning C4024: '_beginthread' : の型が 1 の仮引数および実引数と異なります。』 とのエラーが表示されてしまいます。 アドバイスをよろしくお願いします。 #include <windows.h> #include <process.h> #define APP_NAME TEXT("Sample_MainWindow") typedef struct _ThreadParam {   HWND owner;   POINT point; } ThreadParam; DWORD WINAPI ThreadFunc(LPVOID vdParam) {      ・     (省略)      ・ } LRESULT CALLBACK WindowProc(   HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {   ThreadParam param;   switch(uMsg) {     case WM_LBUTTONDOWN:       param.owner = hWnd;       param.point.x = LOWORD(lParam);       param.point.y = HIWORD(lParam);       _beginthread(ThreadFunc, 0, &param);       return 0;     }   return DefWindowProc(hWnd, uMsg, wParam, lParam); }

  • マルチスレッド化。

    今とても大きな配列を使用し、長時間処理をするプログラムを組んでいます。元々処理時間に1時間を要するプログラムを2分で処理を完了するまでに仕上げました。 しかし、探究心はおさまらずもう少し高速化に挑みたいと考えています。 過去に「猫でもわかる」のSDK第1章と2章を学び、マルチスレッドのプログラムをSDKで組んだことがあります。それを利用してマルチスレッド化を実現したいと考えています。 言語はCでVisualStudio2005を使用しています。 *疑問1   SDKの場合WinMain関数とプロシージャからの実行で_beginthread関数を記述すれば処理が開始されます。 Cでもmain関数内に記述すれば、SDKと同様に処理できるのでしょうか? *疑問2 _beginthread関数の引数に関してです。 第1引数にvoid型のスレッド関数、第2引数に0?、そして第3引数にはスレッド関数に渡すデータの引数を記述すると把握しているのですが、渡したいデータは複数あり、***型と**型、それに変数を数個とスレッド関数に渡したいデータだらけなのですが、どのように記述すればよいでしょう? *疑問3 2つのスレッドを作成しようと考えていますが、その2つのスレッドで1つの大きな配列を共有して処理したいと考えています。 そのため、スレッド間の同期が必要になるわけですが同期の種類にもクリティカルセクションやミューテックス、イベントと豊富でどれを使用すれば良いのか迷ってしまいます。厳密に同期を取り処理をするにはイベントが一番良いと考えています。 これらの疑問に答えられる方はアドバイスをよろしくお願いします。

  • _beginthreadにて発生するコンパイルエラーについて

    過去に近い質問が出ていましたが、探しているような回答が見つからなかったので質問させていただきます。 プログラム作成の過程で_beginthreadを使うことになったのですが、以下のエラーメッセージが表示されます。 error C2664: '_beginthread' : 1 番目の引数を 'void (unsigned long)' から 'void (__cdecl *)(void *)' に変換できません。 (新しい機能 ; ヘルプを参照) スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません 調べた限りC++で作成している為Cでコンパイルされた関数を呼び出す為にC++で指示する必要がある、という事は理解できたのですが、いまいち修正の方法が判りません。 下記に関連部分ソースの一部と開発環境を記載します。 どなたかご教授の方よろしくお願いいたします。 開発環境:Visual C++6.0 プロジェクトの設定でランタイムライブラリはマルチスレッドに設定済み。 WINAPIとして作成、指定URLに接続するためのスレッドを作成したい -------------------グローバル一部--------------- DWORD cthread=0; //グローバルで宣言している addurl[1]; -----------問題の処理WndProc内部(メイン部)--------- addurl[0]=url; //編集したアドレスを貼り付け cthread=_beginthread(OpenURL,0,0); //ここでエラー -----------送る先(OpenURL)------------- void __cdecl OpenURL(DWORD index) { BASS_StreamFree(chan); // close old stream SendMessage(Edit,WM_SETTEXT,0,"connecting..."); if (!(chan=BASS_StreamCreateURL(addurl[index],0,BASS_STREAM_META|BASS_STREAM_STATUS,StatusProc,0))) { SendMessage(Edit,WM_SETTEXT,0,"not playing"); Error("Can't play the stream"); --------------以下省略---------------

  • メンバ関数(メソッド)をマルチスレッドにしたい

    環境はWinXPでVisual Studio 2005を使用しています。 C言語で関数をマルチスレッド化するにはこんな感じでOKでした。 // マルチスレッド関数 void Thread( void * ) { } void MainFunc() {   (HANDLE)_beginthread( Thread, 0, NULL ); } こんな風にスレッド関数をC++のメソッドに変えてうまくいくかと思い class Test_c { public:   void Thread( void * ); } ; // マルチスレッド関数 void Test_c::Thread( void * ) { } void MainFunc() {   Test_c t t;   (HANDLE)_beginthread( t.Thread, 0, NULL ); } とするとエラーが出てきてしまい、コンパイルが通りませんでした。 C++のメンバ関数をマルチスレッド関数としたい場合はどの様に書けばよいのでしょうか・・?

  • スレッドを再生成する方法

    VBからC言語DLLを呼ぶプログラムを作っています。 DLLでスレッドを生成しているのですが、 VBから1回目の呼び出しではうまく動作するのですが、2回目はスレッドが生成されません。 2回目は1回目のスレッドが終了してから呼び出しているのですがなにか処理が必要なのでしょうか? スレッドは_beginthreadexで生成してスレッド関数内のreturnで終了しています。 closehandleを追加してみましたが駄目でした。

  • タイマー関数とマルチスレッドについて

    こんばんわ。 マルチスレッドプログラミングを行なっています。 コンパイラはVC++.NETでC言語を利用しwin32 apiを用いています。 スレッドを_beginthreadex関数でスレッドを2つ生成し、WaitForSingleObject,SetEvent,ResetEvent関数によるイベント同期を利用し、2スレッドの同期をはかっています。 [質問内容] 以下のように、スレッド2でWaitForSingleObject関数にてスレッド2を待機状態にし、スレッド1のSetEvent関数にて待機しているスレッド2を再開させる方法をとっています。 例えば、タイマーをスタート後に待機状態になり、スレッド2が再開後タイマーストップするとした場合、スレッド2が待機状態のときもタイマーを動き続けているのでしょうか? ・スレッド1 SetEvent(hEvent[0]); ・スレッド2 SUSPEND_INTERVAL=20 if(Num%THREAD_SUSPEND_INTERVAL==0){ timestart=timeGetTime();←タイマースタート WaitForSingleObject(hEvent[0],INFINITE); ResetEvent(hEvent[0]); timestop=timeGetTime();←タイマーストップ } よろしくお願いします。

  • スレッド

    スレッドを生成し、データのやり取りを行うプログラムを作成しようとしているのですが、使用関数が分かりません。 どなたか、ご存知でしたら、お教えください。 スレッドの作成関数はpthread_createを使うことは分かりました。 そこからデータを送る、受けるのやり方がわかりません。 プログラムの流れ スレッドを生成し、スレッドにデータを送る。 そのスレッド内で、データを調べ期待値だったらACK、 それ以外だったら、errorを返すといった感じです。 まだスレッドに関して知識が薄い為、質問も分かりづらいと思いますが、宜しくお願い致します。

  • C言語で、自分で作った関数内で終了させるには

    C言語なのですが、自分でエラーチェックをする関数を作りました。 エラーを検出した時点でプログラムを終了させたいのですが、 どのようにすればいいのでしょうか? return 0; はmain関数を終了させるときに使うのはわかるのですが… 初歩的な質問かもしれませんが、よろしくお願いします。

  • JNIからCのメッセージキューが使用できない

    JAVAからJNIを使用してC言語の関数呼び出しを行っています。 C側の関数は内部でmsgrcv()とmsgsnd()を呼び出しているのですが、どちらも処理が正常終了しているにもかかわらず、メッセージ自体の送信(受信)ができていません。しかしながらメッセージ長は正常に取得できている状態です。 このような現象でどういったことが考えられるのでしょうか。 環境は OSがHP-UX11、 JDKのバージョンが1.5です。 宜しくお願い致します。

  • スレッド制御に関して

    C言語の初心者です。 現在、スレッドの勉強をしております。 最近、pthreadをなんとなく理解しつつありますが、 下記の2点に関して試行錯誤しております。 (1)スレッドを周期的に起動したい (2)時間によって起動したい (1)は、例えば30秒毎にスレッドを起動させたい等といった、周期スレッドの生成方法です。今考えているのは、スレッドを生成後、スレッド生成元で30秒間sleepして、2回目のスレッドを起動…。といったイメージを考えております。 (2)に関しても同様で、例えば12時00分00秒にスレッドを生成したいというパターンで、スレッド生成元にて、時間を取得して、その時間が12時00分00秒であればスレッド生成を行うといったイメージを考えております。 上記2案とも初心者なりに考えた案なのですが、他によい案はありませんでしょうか? ご教授頂けますようよろしくお願いいたします。

専門家に質問してみよう