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