如何避免因大量数据循环导致的应用程序死锁?

时间:2014-01-24 11:34:45

标签: c++ qt

以下函数将从点 collectLatlong 的向量中获取点(纬度 - 经度),并检查点1到点2之间的距离是否在100米到140米的范围内,如果是,那么将存储点2在点过滤点的单独矢量中。

然后从点2开始计算 collectLatlong 向量中下一个点之间的距离,这样就可以迭代 collectLatlong 中的所有点。

该功能由

组成

1)向量中的纬度和长点的集合 - collectLatlong

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

3)它使用QGIS API。 QgsPoint表示QT中类似两个QPoint的点(纬度 - 长点)。

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;


  }

2 个答案:

答案 0 :(得分:4)

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

有2个选项可以解决此问题

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

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

答案 1 :(得分:0)

Addon to @ratchet freak answer:

3 /您可以在循环内的某个地方调用QApplication :: processEvents()。但你应该了解Qt事件循环逻辑。此类用例可能会导致性能问题。

IMO,使用QThreads或QtConcurrent更令人难以忍受。