none
VC++ 2010 スレッド作成方法 RRS feed

  • 質問

  • 初心者です。

    VC++でWindowsフォームアプリを作成し、そこでマルチスレッド処理を行いたいのですが、

    スレッドを作成しようとするとエラーが出てしまいます。

    何が何だかわからない状態になってしまい投稿させて頂きました。

    やりたいことは、

    ①ダイアログ上のボタン1をクリックするとスレッドを作成して機械の制御を行う為に機械の状態とフラグの状態をポーリングさせます。

    ②ダイアログ上のボタン2をクリックするとフラグをONにします。

    ③①のスレッド処理内でフラグが変わると機械にコマンドを送信します。

    AfxBeginThreadを使用してみたのですが、「'AfxBeginThread': 識別子が見つかりませんでした」等のビルドエラーが出てしまいます。

    afxwin.hをインクルードしてみたのですが、ビルドエラーになってしまいます。

    またCreateThreadも試してみたのですが、ビルドは通って実行出来るのですが、

    CreateThreadを実行すると、下記のエラーが出てしまいます。

    ランタイムの重大なエラーが発生しました。エラーのアドレスは 0x69df502e、スレッド 0x658 です。エラー コードは 0xc0000005 です。これは CLR のバグであるか、またはユーザー コードのアンセーフまたは確認不可能な部分にバグがある可能性があります。このバグの一般的な原因には、スタックが壊れる可能性のある COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。

    スレッドを作成するにはどのクラスを使用すればいいのでしょうか?

    2014年11月29日 11:28

回答

  • .NET なのですから、まずは Thread クラス を考えましょう。

    AfxBeginThread は MFC アプリケーションで使うための関数です。
    CreateThread で問題が出るのは、そのスレッドで .NET 関連の初期化、準備などができていないまま、.NET のコードを実行したことが原因を予想されます。


    2014年11月29日 11:52
    モデレータ

すべての返信

  • .NET なのですから、まずは Thread クラス を考えましょう。

    AfxBeginThread は MFC アプリケーションで使うための関数です。
    CreateThread で問題が出るのは、そのスレッドで .NET 関連の初期化、準備などができていないまま、.NET のコードを実行したことが原因を予想されます。


    2014年11月29日 11:52
    モデレータ
  • さっそくのご回答ありがとうございます!

    ネットで調べると違う方法でスレッドを作成していたので、よくわからず試してしまいました。

    CreateThread で作成してみます。

    また調べてみて試した結果を報告させて頂きます。

    2014年12月1日 1:22
  • 質問者さんは何よりもまずご自身の使用されている言語、ランタイムライブラリを把握すべきです。ここが把握できていないために、調べて見つけた情報が自身の環境に適用できるか判断できていません。

    その上でC++によるWindowsフォームアプリは非常に敷居の高いもので、かつ情報もかなり少ないです。今回のような質問をされるレベルですとゴールは遠すぎます。現にAzuleanさんの返信を理解できていません。個人的には他の選択肢をお勧めしたいです。

    2014年12月1日 2:56
  • Azulean様

    スレッドの作成が出来ました。


    修正前

    handle = CreateThread(    NULL, 0, (LPTHREAD_START_ROUTINE)関数名, 0, 0, &id);


    修正後

    Thread^ Thread = gcnew Thread( gcnew ThreadStart( &関数名 ) );
    Thread->Start();

    ありがとうございました!

    2014年12月1日 4:14