c++ - 如何避免由于遍历大量数据而导致应用程序死锁?

标签 c++ qt

<分区>

以下函数将从点collectLatlong 的 vector 中获取点(纬度 - 经度),并检查点 1 到点 2 之间的距离是否在 100 米到 140 米的范围内,如果是,则点 2 将被存储在一个单独的点 vector filteredpoints 中。

然后从 point2 开始计算 collectLatlong vector 中下一个点之间的距离,这样 collectLatlong 中的所有点都会被迭代。

函数组成

1) vector 中点的经纬度集合——collectLatlong

2) calculateDistance 函数用于计算两点之间的距离(lat-lon)

3) 它使用 QGIS API 。 QgsPoint表示QT中类似于两个QPoint的一个点(lat-long point)。

4) 我在 ubuntu 中使用 QT。

问题:

此函数将在运行时在 collectLatlong 中收集点后调用此函数后,如果 collectLatlong 中的点数较少,应用程序将执行良好,但如果它更多的应用程序没有响应任何其他操作最终我需要杀死应用程序来关闭它。

请随时询问有关我的问题的问题。

帮我解决这个问题。谢谢。

void filterPoints()
 {
 int size=collectLatlong.size()-1;
 float Dis;
 int A2= 0, B2 = 5;
 Loop:
 if(B2<=size)
 {
 QgsPoint a = collectLatlong[A2] ;  QgsPoint b = collectLatlong[B2];

 Dis = calculateDistance(a,b);


 if(Dis >= 100 && Dis <= 140)
           {

            filteredpoint.push_back(b);

            A2=B2; B2=B2+5;

            goto Loop;

        }

 else if (Dis<100)
        {
            B2++;
            goto Loop;
        }
 else
 {
     B2--;
     goto Loop;
 }

}
} 

float calculateDistance(const QgsPoint& a, const QgsPoint& b)
{
        double pi = 3.14/180.0;
        double Ab,c,d , dLat,dLon,lat1,lat2,lon1,lon2;
        int R= 6371;
        lat1=a.y()*pi; lat2=b.y()*pi;
        lon1=a.x()*pi; lon2=b.x()*pi;

        dLat = lat2-lat1;
        dLon = lon2-lon1;

        Ab = sin(dLat/2)*sin(dLat/2)+sin(dLon/2)*sin(dLon/2)*cos(lat1)*cos(lat2);
        c = 2*atan2(sqrt(Ab),sqrt(1-Ab));
        d=R*c*1000;
        return d;


  }

最佳答案

首先,您可以删除 goto 并将第一个 if 替换为 while

有两个选项可以解决这个问题

  1. 首先您需要拆分工作并使用计时器重复运行一大块工作

  2. 您可以在后台线程中运行循环,并通过信号将部分结果报告回 gui 线程

关于c++ - 如何避免由于遍历大量数据而导致应用程序死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21331635/

相关文章:

c++ - 调整屏幕大小时消失的对象(OpenGl)

c++ - 两个使用不同 libstdc++ 版本的静态库

c++ - QTextEdit。如何手动选择文本?

c++ - 如何将数据作为可变引用从 QML 传递到 C++

c++ - 为什么依赖的应用程序要使用与动态库相同的编译器?

c++ - 如何编译使用从不同编译器编译的库的应用程序?

c++ - Qt MySQL - 创建新表

c++ - 如何在标准 C/C++ 代码上包含和翻译自定义指令/扩展以保持高性能

c++ - 无法在派生类的构造函数的初始化中访问 protected 函数

c++ - QDir 目录之前的预期不合格 ID