MessageBox Threading Проблемы

0

У меня странное поведение Messagebox, запущенного в Thread, используя этот код:

DWORD WINAPI CreateMessageBox(LPVOID lpParam) {
    MessageBoxA(NULL, (char*)lpParam, "", MB_OK);
    return 0;
}
std::string msg = "Hello World";
CreateThread(NULL, 0, &CreateMessageBox, msg.c_str(), 0, NULL);

Хотя этот код работает нормально:

DWORD WINAPI CreateMessageBox(LPVOID lpParam) {
    MessageBoxA(NULL, (char*)lpParam, "", MB_OK);
    return 0;
}
CreateThread(NULL, 0, &CreateMessageBox, "Hello World", 0, NULL);

Я не могу понять, почему он работает, когда он не является переменной, и если я изменю его на переменную, отображается Empty MessageBox, но я ожидал "Hello World !.

Теги:
multithreading
visual-c++
variables
messagebox

1 ответ

0
Лучший ответ

msg - локальная переменная (выделенная в стеке), и она будет уничтожена, как только функция/метод, содержащий этот код, вернется. Таким образом, поток будет получать доступ к недопустимой памяти при использовании lparam.

Некоторые из решений могут быть следующими:

1.) declare 'msg' as static - probably not a good idea
2.) allocate 'msg' on heap, but then you will have to destroy it somewhere
3.) make 'msg' a member variable
  • 0
    Можете ли вы привести пример? Я не понимаю, что вы имеете в виду. Если я объявляю msg как статическую (это было проще всего), я получаю ошибку сегментации, поэтому я вернул ее обратно, потому что вы написали не очень хорошую идею. Можете ли вы дать мне пример того, что вы имеете в виду с другими двумя вещами?
  • 0
    Вы не должны получать нарушение прав доступа, если используете статическую переменную. Во всяком случае, что касается третьего варианта, у вас есть этот код в каком-то классе, верно? Я имею в виду, что вы пометили свой вопрос тегом 'c ++'. Затем добавьте std::string msg в качестве переменной-члена к этому классу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню