3

非 void 関数をスレッドで実行する関数として使用するにはどうすればよいですか。

つまり、次のような関数です。

void example(Mat& in, Mat& out)

この関数をスレッドに使用するにはどうすればよいbeginthreadxですか?

マルチスレッド コードで変換するコードを貼り付けます。

#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <stdio.h>
#include <windows.h>
#include <process.h>

using namespace std;
using namespace cv;

//filling array
void acquisisci (Mat in[]){
in[0]=imread("C:/OPENCV/Test/imgtest/bird1.jpg",1);
in[1]=imread("C:/OPENCV/Test/imgtest/bird2.jpg",1);
in[2]=imread("C:/OPENCV/Test/imgtest/bird3.jpg",1);
in[3]=imread("C:/OPENCV/Test/imgtest/pig1.jpg",1);
in[4]=imread("C:/OPENCV/Test/imgtest/pig2.jpg",1);
in[5]=imread("C:/OPENCV/Test/imgtest/pig3.jpg",1);
   }

//grey function
void elabora (Mat& in, Mat& out){
    if (in.channels()==3){
        cvtColor(in,out,CV_BGR2GRAY); //passa al grigio
        }
  }
  //threshold function
  void sogliata(Mat& in, Mat& out){
threshold(in,out,128,255,THRESH_BINARY);//fa la soglia
 }

 //view
  void view (Mat& o){
imshow("Immagine",o);
   waitKey(600);
   }

  int main(){

Mat in[6],ou[6],out[6];

acquisisci(in); 

for (int i=0;i<=5;i++){
elabora(in[i],ou[i]); 
}

for (int i=0;i<=5;i++){
sogliata(ou[i],out[i]);
}   

for (int i=0;i<=5;i++){
view(out[i]); 
}
  return 0;

  }

並列スレッドでこれを行うことはできますか??

4

3 に答える 3

4

beginthreadxvoid*単一の引数を持つ関数でのみ使用できます。複数の引数が必要な場合は、両方の値を含む構造体を作成し、その構造体へのポインターを唯一の属性として渡します。例えば:

struct Args {
  Mat& in;
  Mat& out;
};

void example(void* param) {
  Args* args = (Args*) param;
  process(args->in, args->out);
}
于 2013-05-15T16:20:46.077 に答える
4

_beginthreadexスレッド関数には特定の署名が必要です。

 void(*thread_func)(void *);

別のシグネチャを持つ関数を使用するには、通常、「サンク」を作成するだけです。これは、本当に呼び出したい関数を呼び出すだけの小さな関数です。

struct params {
    Mat &in;
    Mat &out;        
};

void thread_func(void *input) { 
    params *p = (params *)input;

    example(input->in, input->out);
}

おそらく、出力でデータの準備ができたときに通知する Windows のようなものを含める必要があるでしょう。Eventスレッド内の関数がデータを書き込む機会を得る前に、それを読み込もうとするのは望ましくありません。

struct params {
    Mat &in;
    Mat &out;        
    HANDLE event;

    params() : event(CreateEvent(NULL, 0, 0, NULL)) {}
    ~params() { CloseHandle(event); }
};

void thread_func(void *input) { 
    params *p = (params *)input;

    example(input->in, input->out);
    SetEvent(input->event);
}

次に、呼び出し元の関数を startthread_funcで実行し、結果が必要な場合は、イベント ハンドルに対してWaitForSingleObjector などWaitForMultipleObjectsを実行して、必要なデータがあるときに処理を続行できるようにします。

于 2013-05-15T16:31:31.417 に答える
2

C++11 を使用している場合は、ラムダと を使用できますstd::thread

Mat in, out;
std::thread([&]{ example(in, out); });

C++11 を使用していない場合は、この回答を無視してください。

于 2013-05-15T16:23:39.580 に答える