使用 SDL 和多线程的程序只是停止执行并挂起 [关闭]

问题描述 投票:0回答:0

我的问题: 我正在编写一个应用程序来显示由图块制成的地图。这些图块是从 openstreetmap 收集的。我将磁贴存储为带有

SDL_Texture*
的类,它的位置和缩放级别在
unordered_set
中。我必须为此编写一个哈希函数,这是我从另一个 StackOverflow 问题中获得的。如果用户使用鼠标滚动(= 放大或缩小),则会创建并执行检查可见区域中新图块的线程。该线程简单地向
tile.openstreetmap.org
发送一个具有相应缩放级别和位置的 HTTP 请求,并将图块添加到无序集合,然后进行渲染(将 base64 字符串转换为
SDL_Texture*
。当我放大一次时,它工作得很好。但是在第二次尝试时,有时是第三次,只有几个瓦片渲染。之后,程序停止执行并挂起。它没有崩溃,我必须手动关闭它。

一些信息: 我使用的是 C++20、Visual Studio 2022 版本 17.5.3。 代码如下: 解决方案的名称是“ThunderFS”,项目是“FlightPlanner”。 我真的无法给出任何类型的最小可重现示例。这是整个应用程序,崩溃了,所以我需要在这里输入 +400 行。

我试过的:

  1. 使用调试器找出它挂在哪里,也许是在一个无限循环中,或者让它把我带到抛出异常的地方。但是什么都没有,没有断点做任何事情。可视化线程也没有给我任何信息。

  2. 使用信号量是因为我认为问题在于创建的线程(每次用户缩放时都会创建一个线程)相互干扰。那并没有解决它。

我还尝试使用单独的线程来清理以前创建的线程,这样它们就不会成为“僵尸”。那也没有解决问题。

我也试过,为了调试目的,调用

SDL_GetError()
。如您所料,也没有。

我也试过(我代码的当前状态)添加一个整数作为控件来检查线程是否已经结束。当用户缩放时,如果

threadStatus == 1
才打开线程,然后设置为
0
。在线程结束时,它被设置回 1。像这样,我避免创建多个线程来处理无序集,但不会阻塞主线程。

我一直没能正确诊断出问题,但是,只有当要加载的tile数量很大(至少超过4个)时才会出现这个问题。这肯定与这个问题有关。

我想要什么: (期望的行为) 基本上类似于谷歌地图。只是平铺功能,我已经设法开始工作,但我添加了多线程,以便用户仍然可以在仍在加载图块时移动地图,就像其他地图应用程序工作或似乎工作一样。

c++ multithreading openstreetmap sdl-2
© www.soinside.com 2019 - 2024. All rights reserved.