-2

アプリケーションでスレッド化の概念を理解し、実装しています。今以来、物事は順調に進んでいます。しかし、私にはまだ答えられていない質問がいくつかあり、それらが私の作業を遅らせています。どなたか回答いただければ幸いです

  1. Createthread() では、引数を 1 つだけ取ることができますか? MSDN の Web サイトや他のすべての例で見たように、LPVOID という引数は 1 つしかありませんでした。

  2. もう一つは、戻り値 DWORD WINAPI が戻り値として何を意味するかです。DWORD 、 int 、またはその他の戻り値の型のみを使用できますか。私はそれがHANDLEと関係があると思います(そうかもしれません)

  3. 私はスレッドの配列を使用したいので、配列を関数に学習し、(私が理解しているように)スレッド自体は CreateThread() ルーチンによって呼び出される単なる関数であるため、その概念をそこに実装しようとしましたが、できませんでした戻り値の型 DWORD WINAPI が許可されていませんでしたか?

  4. ファイルを保存するための単一のスレッドが1つありますが、複数のファイルを同時に保存できるようにその配列が必要です(正確には同じ開始時間ではなく、並列ファイル保存のようなものです)。どうやってやるの?

ありがとうシャン

4

2 に答える 2

2
  1. void *実際、 (LPVOID)型の引数を 1 つだけ取ることができます。ただし、任意のものを指すことができるため、struct またはオブジェクトを指すことができます (通常、存続期間の理由でヒープに割り当てられます)。
  2. WINAPI は戻り値の一部ではなく、関数の呼び出し規約です。この関数は、DWORD またはそれに適合するものを返す必要があります。Win64 ではポインターは DWORD に収まらないため、ポインターを返してはなりません。
  3. わかりません、何をしようとしているのか詳しく説明してください。
  4. 通常、これには単一のスレッド関数が必要であり、毎回異なる引数で CreateThread() に数回渡されます。必要がなくなるまでスレッド ハンドル (配列に保存する可能性が高い) を保持し、CloseHandle() で閉じることを忘れないでください。
于 2013-12-17T09:51:02.037 に答える
0

ポイント 3 については、理解できたと思いますので、別の方法で試してみます。使っていた

DWORD WINAPI save_uwpi_file0( LPVOID )
{
while(1)
{
    if(release == 1 && flag_oper1 == 1)
    {
    int w_cnt = 0;  FILE *opfile;
    char fname[30] = "txt_file0.txt";
    //opening file for write
    opfile = fopen(fname , "w");

    printf("assigning memory for file 1 \n");
    ssint *Lmem = (ssint *)malloc( sizeof(ssint)*size_of_memory);

    memcpy(Lmem, pInDMA, sizeof(ssint)*size_of_memory);
    release = 0;
    printf("relseaing for second file saving\n");
    for( int nbr = 0; nbr < size_of_memory; nbr++){
        fprintf(opfile , "%hi\n", Lmem[nbr] );
        }
    printf("aligned free 1\n");
    free(Lmem);

    fclose(opfile);

    printf("File saved 1\n\n");
    return 1;
    }   //if statement ends
}
}

そして、私は(スレッド)関数へのポインタを作るために以下を使用していました

DWORD WINAPI (* save_uwpi_file0)(LPVOID);

私は次のようなものを試してみるべきだと思います

DWORD (* save_uwpi_file0)(LPVOID);

私はそれを行い、結果をここに投稿します

于 2013-12-18T03:04:47.907 に答える