我注意到我的SDLD 2/C++应用程序不能正常工作,或者我没有做任何修改。所以我试着在Ubuntu 22.04虚拟机上执行它,它工作了。经过几次测试,我注意到如果我从std::tread Tread函数中取出我的渲染函数,它会重新工作。但是当“program”函数没有完成时,我的程序就会卡住。
下面是我的代码(在前面的线程实现的注解中):
#include <SDL2/SDL.h>
#include <array>
#include <cstdlib>
#include <time.h>
#include <thread>
#include "const.hpp"
#include "maze_crea.hpp"
#include "maze_solver.hpp"
void program(SDL_Window* pWindow, SDL_Renderer* pRenderer){
std::array<int, MAZE_SIZE<int>> maze;
std::array<SDL_Rect, MAZE_SIZE<int>> squares;
for (int i = 0; i < MAZE_SIZE<int>; i++){
squares[i] = { (i % SIDE_SIZE<int>) * (WIDTHSCREEN<int> / SIDE_SIZE<int>), (i / SIDE_SIZE<int>) * (HEIGHTSCREEN<int> / SIDE_SIZE<int>), WIDTHSCREEN<int> / SIDE_SIZE<int>, HEIGHTSCREEN<int> / SIDE_SIZE<int> };
if (((i % SIDE_SIZE<int>) % 2 == 0) || ((i / SIDE_SIZE<int>) % 2 == 0)){
maze[i] = 0;
} else {
maze[i] = i;
}
}
SDL_SetWindowTitle(pWindow, "Maze Solver (creation)");
mazeCrea(pRenderer, maze, squares);
SDL_SetWindowTitle(pWindow, "Maze Solver (solution)");
mazeSolver(pRenderer, maze, squares);
}
int main(int argc, char* argv[])
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
return EXIT_FAILURE;
}
SDL_Window* pWindow{ nullptr };
SDL_Renderer* pRenderer{ nullptr };
if (SDL_CreateWindowAndRenderer(WIDTHSCREEN<unsigned int>, HEIGHTSCREEN<unsigned int>, SDL_WINDOW_SHOWN, &pWindow, &pRenderer) < 0)
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "[DEBUG] > %s", SDL_GetError());
SDL_Quit();
return EXIT_FAILURE;
}
srand(time(NULL));
//std::thread Thread(program, pWindow, pRenderer);
program(pWindow, pRenderer);
SDL_Event events;
while (true)
{
while (SDL_PollEvent(&events))
{
switch (events.type)
{
case SDL_QUIT:
SDL_DestroyRenderer(pRenderer);
SDL_DestroyWindow(pWindow);
SDL_Quit();
return EXIT_SUCCESS;
break;
}
}
}
//Thread.join();
SDL_DestroyRenderer(pRenderer);
SDL_DestroyWindow(pWindow);
SDL_Quit();
return EXIT_SUCCESS;
}
字符串
如何正确处理的情况下,我的“程序”funcntion需要时间,但我希望能够退出应用程序在任何时候,所以我的事件循环也需要访问。
1条答案
按热度按时间col17t5w1#
你需要将生成和求解代码从渲染中分离出来。最简单的方法就是将程序一分为二,在它们之间使用一个共享变量来传递状态。
在这种情况下,状态实际上只是
maze
。在主循环中,预先生成
squares
。然后在游戏循环的每次迭代中,从maze
读取状态并更新squares
以匹配。在线程中,解决迷宫并将结果写回
maze
或辅助共享数据结构。