Windows 7 マシンで Visual Studio 2010 と OpenMP を使用しています。次のコード スニペットを作成しました。
#pragma omp parallel for
for(int jj=0;jj<2;jj++){
MSG msg;
// do something in parallel for jj
int i_loopcounter = 0;
bool b_continue = true;
while(GetMessage(&msg, NULL, 0, 0)&&b_continue){
TranslateMessage(&msg);
DispatchMessage(&msg);
i_loopcounter++;
if(i_loopcounter==50){
b_continue = false;
//abort(); <- ugly, since a window appears
//exit(0); <- rest of the code is not executed
//break; <- not allowed
//goto end; <- not allowed
}
}
end:;
// do some other stuff in parallel for jj
} //end of parallel for
私の問題は次のとおりです。
変数を使用するb_continue
と、最初の while ループがアボート条件に達したときにプログラムがハングアップし (これは競合状態ですか?)、その結果、プログラムは残りの部分を実行しません。コード。
では、どうすればこれを機能させることができますか?
openmp の構造化ブロックの解除で提案されている解決策を試しましたが、状況は変わりません。
ハードウェアからファイルをダウンロードするには、自己破壊する while ループが必要です。終了後、プログラムはそのファイルに対して何らかの作業を行う必要があります。コードの並列化を開始する前は、while ループで break ステートメントを使用してうまく機能していました。
この問題を解決するためのヒントをくれたコメントに感謝します。
更新:コードを次のように変更しました
int i_loopcounter = 0;
while(_i_NoDownloads!=2){
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
i_loopcounter++;
if(_b_control){
cout<<i_loopcounter <<" of Thread "<<omp_get_thread_num()<<endl;
}
}
グローバル変数_i_NoDownloads
は、ダウンロードされたファイルの数をカウントします。2 に達すると、メッセージ ループは不要になります。ただし、これを変更してもプログラムの動作は変わりません。while ループが必ずしも 50 回繰り返されるとは限りません。問題は、メッセージ ループを同時に破壊することだと思います。
更新 2: Windows メッセージの概念について多くのことを読んだ後、機能する解決策を見つけました。並列セクションが終了しなかった理由は、GetMessage の動作です。
繰り返しになりますが、この問題に貢献してくれたすべての人に感謝します。
乾杯TL