我正在撰寫一個程式,它將檢測按鍵并執行某些操作(在這種情況下顯示一個訊息框),當我嘗試退出該程式時,它一切正常,它顯示了一個像這個錯誤視窗這樣的彈出視窗。現在這個視窗不會弄亂我的程式中的任何東西,所以我可以把它留在那里,但它很煩人。這是一個最小的可重現示例,我剛剛開始在 win32 中撰寫代碼,所以請不要批評我的低效代碼
#include <Windows.h>
#include <thread>
#include <chrono>
#define HFFFA 1001
#define MAINWINDOWSTYLE WS_OVERLAPPED| WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
std::chrono::milliseconds THREAD_WAIT(50);
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_COMMAND:
{
switch (wp)
{
case HFFFA:
{
MessageBox(hwnd, L"Sucess", L"Success", MB_OK);
break;
}
break;
}
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW));
EndPaint(hwnd, &ps);
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
break;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
void GetKeyPress(HWND hwnd)
{
int keypressed = -1;
while (TRUE)
{
if (GetAsyncKeyState(VK_F6))
{
SendMessage(hwnd, WM_COMMAND, (WPARAM)HFFFA, TRUE);
}
std::this_thread::sleep_for(THREAD_WAIT);
}
}
int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE hiprevinst, PWSTR nCmdLine, int ncmdshow)
{
const wchar_t CLASS_NAME[] = L"Axom";
WNDCLASS wc = { };
wc.lpfnWndProc = WndProc;
wc.hInstance = hinst;
wc.lpszClassName = CLASS_NAME;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(0, CLASS_NAME, L"Axom", MAINWINDOWSTYLE, CW_USEDEFAULT, CW_USEDEFAULT, 592, 600, NULL, NULL, hinst, NULL);
ShowWindow(hwnd, ncmdshow);
std::thread td(GetKeyPress, hwnd);
MSG msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
uj5u.com熱心網友回復:
當事件回圈結束時,所有wWinMain區域變數都會被銷毀。其中之一是td作為您的執行緒。當std::thread它處于可連接狀態時被銷毀,std::terminate呼叫:
當程式由于以下任何原因而無法繼續時,C 運行時會呼叫std::terminate:
- 一個可連接的 std::thread 被銷毀或分配給
默認std::terminate行為是呼叫std::abort函式。
默認的 std::terminate_handler 呼叫 std::abort。
您必須在td執行緒被銷毀之前分離或加入執行緒。如果加入執行緒,則必須添加一些機制(例如通過全域標志變數)來通知GetKeyPress執行緒函式何時離開。
std::atomic_bool stopFlag; // global variable
void GetKeyPress(HWND hwnd) {
int keypressed = -1;
while (!stopFlag) {
if (GetAsyncKeyState(VK_F6))
SendMessage(hwnd, WM_COMMAND, (WPARAM)HFFFA, TRUE);
std::this_thread::sleep_for(THREAD_WAIT);
}
}
std::thread td(GetKeyPress, hwnd);
MSG msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
stopFlag = true;
td.join();
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/350352.html
