1

(Visual C++ 2008 を使用して) C++ の別のスレッドでメソッドを実行する方法を見つけるのに問題があります。これを行う方法をいくつか試しましたが、これまで成功したものはありません。

私は C++ の初心者ですが、Java の経験豊富なプログラマーですが、古い C++ アプリケーションのいくつかのバグを修正するタスクを与えられています。このプログラムは、「Mpeg」と呼ばれるオブジェクトを使用して、Mpeg ファイルのパケット化とデパック化を制御します。Mpeg オブジェクトを適切にセットアップした後、mpeg.Depacketise を呼び出す必要があります。これにより、メソッド DepacketiseInputFile() が実行されます。

_beginthread と System::Threading::Thread オブジェクトの両方を使用して、DepacketiseInputFile() を別のスレッドで実行しようとしました。

Thread^ th = gcnew Thread(gcnew ThreadStart(DepacketiseInputFile));

ただし、これはエラーを返します

&Mpeg::Depacketise を使用するとエラーが発生します

_beginthread を使用する場合、私が試したコードは

ただし、これにより、引数を正しく取得するのに常に問題があり、次のようなエラーが発生しました

不意に現れること。

誰もが推奨できる簡単な方法はありますか?私はこれをいじって数日過ごしましたが、どこにも行かないようです:(

どんな助けでも大歓迎です。

乾杯。

4

2 に答える 2

1

変化する

_beginthread(DepacketiseInputFile(), (unsigned)0, (void *)NULL);

_beginthread(DepacketiseInputFile, (unsigned)0, (void *)NULL);

DepacketiseInputFileその関数の戻り値(から取得するもの)ではなく、実行する関数のアドレス( )を渡したいとしますDepacketiseInputFile()

DepacketiseInputFileは として宣言されておりvoid DepacketiseInputFile(void*)、一部のクラスの非静的メンバー関数ではないと想定しています。そうしないと、括弧を削除しても型が一致しません。

于 2011-10-17T14:43:35.860 に答える
1

Mpegってどんな種類?DepacketiseInputFile とはどのようなメソッドですか?

通常のアンマネージ C++ クラスの場合は、_beginthread を使用しますが、DepacketiseInputFile を静的にする必要があります。メンバー関数を取ることはできません。

また、DepacketiseInputFile() で DepacketiseInputFile を呼び出さないでください。

  &Mpeg::DepacketiseInputFile

取得した void* を使用して、Mpeg オブジェクトへのポインターを渡す (そしてキャスト バックする) 必要があります。

ThreadStart を使用する場合は、Mpeg がマネージド クラスである必要があります。

編集: DepacketiseInputFile を作成したいが、オブジェクトにアクセスする必要がある場合は、void* 引数を使用してポインターを渡します。

だから.hで:

 void DepacketiseInputFileMember();
 static void DepacketiseInputFile(void *thisObj);

コードは DepacketiseInputFileMember() に入り、次のように DepacketiseInputFile を記述します。

 void Mpeg::DepacketiseInputFile(void *thisObj)
 {
     Mpeg* mpeg = reinterpret_cast<Mpeg*>(thisObj);
     mpeg->DepacketiseInputFileMember();
 }

_beginthread を呼び出すときは、これを使用します

 _beginnthread(&Mpeg::DepacketiseInputFile, (unsigned)0, anMpegObjectPointer);

anMpegObjectPointerMpeg 型のオブジェクトへのポインタです。オブジェクトの存続期間が、スレッドで必要とされるよりも長いことを確認する必要があります。

私の構文を許してください、私はこれをVisual Studioではなくテキストエリアに書いています

于 2011-10-17T14:44:21.883 に答える