1

これは MFC プロジェクトの一部です。クラッシュします。1.配列の配列をできるだけ早くバイナリファイルに書き込もうとしています。EnterCriticalSection などのクラッシュを回避するためにさまざまな方法を使用しましたが、機能しませんでした。これはより大きなプロジェクトの例です。私はそのようなアプローチの実現可能性を実践しようとしています。

char filename[200];
UINT ThreadProc( LPVOID Param );
int *BUF[10];
int count = 0;
void CThreadDlg::OnOK() 
{
     for (int i = 0; i < 10; ++i)
     {
            BUF[i] = new int [500];
            for (int j = 0; j < 500; ++j)
            {
                BUF[i][j] = i + j;
            }



            AfxBeginThread(ThreadProc,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
            count  = count + 1;

     }



     for (int i = 0; i < 10; ++i)
     {
        delete [] BUF[i];
        BUF[i] = NULL;
     }

}


UINT ThreadProc( LPVOID Param )
{
    sprintf_s(filename, "C:\\Temp\\test%d.bin", count);
    std::ofstream file;
    file.open(filename, std::ios::out);
    file.write((char *)BUF[count], 4*500);
    file.close();
    file.clear();

    return TRUE;
}
4

2 に答える 2

0

コードにはスレッド同期がありません。10 個の異なるバッファー (500 個の要素) を動的に割り当て、10 個の異なるスレッドを開始します。バッファをスレッドに論理的に割り当てます。しかし、変数を同期しません。考慮して下さい:NthNthcount

  • からOnOK、3 であると仮定しcountます。そのためのバッファを割り当てて、スレッドを開始します。この新しいスレッドで受信されると想定 しています。count = 3しかし、あなたはひどく間違っています。の値はcount、スレッドが実際に開始されたときに 3..10 になる場合があります (つまり、4 番目のスレッドでありcount=3、以前に開始されたスレッドは無視されます)。count同じファイルが複数のスレッドで処理される可能性があるため、ファイル名を重複させることができます。
  • すべてのスレッドを開始するとすぐに、割り当てられたバッファーをすぐに削除します! スレッドが処理を開始/終了した場合としない場合があることを知っていますか? スレッドに処理させずに、バッファのセット全体を削除するにはどうすればよいでしょうか? バン!クラッシュ!

BUFグローバル変数を使用する代わりにcount、この種のスレッド同期/データ受け渡しを行います。thread-paramバッファーを (for ループ内で) 割り当て、パラメーター (LPVOID引数)を使用してバッファーを送信するだけです。スレッド内で同じバッファを受け取り、型キャストして使用し、書き込み、スレッド自体から削除します。からバッファを削除しないでくださいOnOK

サンプルコード:

int* pBuffer = new int [500];
// Assign different values to `pBuffer`, and then...
AfxBeginThread(ThreadProc,pBuffer);

スレッド内:

UINT ThreadProc( LPVOID Param )
{
   int* pTheBuffer = (int*)Param;
   ...
}

この記事、またはこの記事をお読みください。

于 2012-11-28T07:49:18.710 に答える
0

BinaryReader.Read(byte[], int, int)チャンクを (またはを使用してBinaryReader.ReadBytes(int)) 読み取り、それを使用Buffer.BlockCopyしてバイトから float などに効率的に変換するのがおそらく最も簡単です。ただし、これはエンディアンに依存することに注意してください。より堅牢に変換したい場合 (後でエンディアンを変更したり、ビッグ エンディアン プラットフォームで実行したりできるようにするため)、おそらくReadFloat()繰り返し呼び出す必要があります。

于 2012-11-28T05:04:02.510 に答える