2016-11-13 8 views
0

2つのスレッド、マップされたメモリ位置に書き込むスレッド、およびこの場所からの他の読み取りを作成しようとしています。
これまでのところ、スレッドとその付属機能を正常に作成しましたが、主な問題は、最初のプロセスがマップされたファイルに書き込むときにエラー値6を返します。つまり、INVALID_HANDLE_EXCEPTIONですが、同じ方法でマップされた場所に書き込むことができる別のプログラムを作ったので、なぜそうするのだろうか。これは私のコードで、エラーがwrite_in_mapped機能でスローされます。WinAPIスレッドがメモリマップファイルに書き込めません

#include <iostream> 
#include <string> 
#include <Windows.h> 

using namespace std; 

HANDLE hMutex = CreateMutex(NULL, false, NULL); 

int write_in_mapped(HANDLE memoryFile) { 
    cout << memoryFile << endl; 

    WaitForSingleObject(hMutex, INFINITE); 

    string message = ""; 

    for (int i = 0; i < 200; i++) { 
    int a = rand() % 10000; 
    int b = a * 2; 

    message.append(to_string(a)).append(",").append(to_string(b)).append(";"); 
} 

HANDLE mapFile = MapViewOfFile(memoryFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024); 
if (mapFile == INVALID_HANDLE_VALUE) { 
    cout << "Unable to map shared memory 1 - error value:" << GetLastError() << endl; 
    CloseHandle(memoryFile); 
    system("pause"); 
    return FALSE; 
} 

if (size(message)) { 
    cout << message << endl; 
    CopyMemory(mapFile, message.c_str(), strlen(message.c_str()) * sizeof(TCHAR)); 
    cout << "Succesfully loaded numbers!" << endl; 
} 
else { 
    cout << "Couldn't create numbers!" << endl; 
    CloseHandle(mapFile); 
    CloseHandle(memoryFile); 
    return FALSE; 
} 

    ReleaseMutex(hMutex); 

    cout << "Done write_to_mapped" << endl; 

    return 0; 
} 


int read_from_mapped(TCHAR name[]) { 

cout << name << endl; 

WaitForSingleObject(hMutex, INFINITE); 

HANDLE openFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, name); 
if (openFile == INVALID_HANDLE_VALUE) { 
    cout << "Error at opening mapped memory 2 - error value:" << GetLastError() << endl; 
    system("pause"); 
    return FALSE; 
} 

LPTSTR mapFile = (LPTSTR)MapViewOfFile(openFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024); 
if (mapFile == NULL) { 
    cout << "Error at mapping memory 3 file - error value:" << GetLastError() << endl; 
    CloseHandle(openFile); 
    system("pause"); 
    return FALSE; 
} 

    string result = string(mapFile).c_str(); 

    cout << result << endl; 

    ReleaseMutex(hMutex); 

    return 0; 
} 

int main() { 

    HANDLE process_1, process_2, memoryFile; 
    TCHAR name[] = TEXT("Global\\MyFileMappingObject"); 

    memoryFile = CreateFileMapping(0, 0, PAGE_READWRITE, 0, 1024, name); 

    if (memoryFile == INVALID_HANDLE_VALUE) { 
     cout << "Error at opening mapped memory area - " << GetLastError() << endl; 

    system("pause"); 
    return FALSE; 
} 

    process_1 = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)write_in_mapped, &memoryFile, NULL, NULL); 
    WaitForSingleObject(process_1, INFINITE); 

    process_2 = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)read_from_mapped, &name, NULL, NULL); 
    WaitForSingleObject(process_2, INFINITE); 

    CloseHandle(memoryFile); 
    CloseHandle(hMutex); 

    system("pause"); 
    return 0; 
} 
+0

の答えで概説これらのエラーに加えて、より多くのがあります:あなたはCreateThread' 'へあなたの呼び出しでスレッドルーチンのキャストが必要な場合は、使用しています間違った関数の署名。この場合、間違った引数を渡していて、呼び出し規約がありません。より微妙なバグは、 'GetLastError()'をあまりにも遅く呼び出すことです。意味のある値を返す条件を満たすと即座に呼び出す必要があります**。 STDOUT(スレッドの最後のエラー値を設定する可能性があります)に書き込んだ後に呼び出しています。 – IInspectable

答えて

2

あなたのコードはミスの信じられないほどの数を含みます。すべてのコードは1つの大きな間違いです。 CreateFileMappingおよびOpenFileMappingはエラー時には0を返しますが、INVALID_HANDLE_VALUEは返しません。 ?そうとCloseHandle HANDLE mapFile = MapViewOfFileINVALID_HANDLE_EXCEPTIONを得た - - しかし、あなたが使用&memoryFileのでwrite_in_mappedに無効なハンドルを得たので、2時間近いmemoryFileを試してみてください - & なしmemoryFilenameを必要とするとき、あなたはint write_in_mapped(HANDLE memoryFile)からCloseHandle(memoryFile);int main()からを呼び出し、これは何ですか?!?ように、そのため

悪夢

+0

ありがとうございました、実際には、私たちは 'Thread'パラメータについて正しいですが、次に答えを少し分かりやすくしてください。 – Justplayit94

関連する問題