AJAX长时间轮循交互数据时客户端句柄数持续增加的解决方法

        在用AJAX做实时监控程序时,一直被客户端句柄数不断增加这个问题所困扰。原以为这是XMLHTTP对象在作怪,忽然发现还是自己编程习惯所至。特别是对于javascript这种需要借助脚本解析器的弱类型编成语言。真是一个小小的疏忽能带来严重的后果。

         先看看普通的AJAX客户段写法

 

function Request()
    

            
        
try {
          xmlhttp 
= new ActiveXObject("Msxml2.XMLHTTP");  //W3C标准
            }
 catch (e) {
             
try {
                xmlhttp 
= new ActiveXObject("Microsoft.XMLHTTP");   //微软标准
            }
 catch (e) {
            xmlhttp 
= false;
            }

         }

        
if (!xmlhttp && typeof XMLHttpRequest!='undefined'{
          xmlhttp 
= new XMLHttpRequest();
        }

        xmlhttp.onreadystatechange 
= ResponseContents;
        xmlhttp.open(
'POST', url, true);
        xmlhttp.SetRequestHeader (
"Content-Type","text/xml; charset=gb2312"); 
        xmlhttp.send(data);
    }

然后再加上回调处理函数就完成了一个简单的ajax调用

 

    //监听数据
    function ResponseContents()
    
{
        
if (xmlhttp.readyState==4)
        
{
             
if (xmlhttp.status==200)
             
{
                    div 
= document.getElementById("testDiv");
                    div.innerHTML 
= xmlhttp.responseText;                   
             }

             
else
             
{
                alert(
"XML文档错误: "+xmlhttp.statusText);
             }

        }

    }

在定时做请求的时候会发现,客户端IE的资源如占用内存,句柄数等都在持续的上升。如果请求频率比较高的话,占用资源就相当可怕。

如果调用javascript自带的垃圾处理函数

 

 function Collect()
    
{
       CollectGarbage();
    }

则呈现一个有趣的现象,客户端占用的内存会回收,但是句柄数的问题仍然没有改观。

        这个小问题困扰了我好久,一直都没有解决。折腾了好久最后才发现是自己写脚本的时候没有注意,其实稍作规范,这个问题就解决了。

在Requset函数中每一次新建xmlhttp对象前加上相当简单的一行代码

 

var xmlhttp = null;

然后再定时调用Collect函数垃圾回收就什么问题都没有了。内存和句柄数都能及时地释放。估计是脚本解析器中交叉引用后引用计数无法清零所致。

         一直很奇怪,作为一个比较成熟的ajax框架,ajax.net为什么没有注意到客户端句柄数问题。虽然看似一次两次问题每什么,但请求多了怎么办呢?ajax框架中新建请求对象的代码如下

 

function ajax_create_request(context)
{
    
for(var i=0; i<requests.length; i++)
    
{
        
if(requests[i].readyState == 4)
        
{
            requests[i].abort();
            requests[i].context 
= context;
            
return requests[i];
        }

    }


    
var pos = requests.length;
    
    requests[pos] 
= Object();
    requests[pos].obj 
= new XMLHttpRequest();
    requests[pos].context 
= context;
    
    
return requests[pos];
}

虽然XMLHttpRequest函数中

 

var XMLHttpRequest = function()
{
    
var request = null;
    
try
    
{
        request 
= new ActiveXObject('Msxml2.XMLHTTP');
    }

    
catch(e)
    
{
        
try
        
{
            request 
= new ActiveXObject('Microsoft.XMLHTTP');
        }

        
catch(ee)
        
{}
    }

    
return request;
}

中做了上述的处理,但实际问题并没有解决,因为在ajax_create_request中存在着这样的代码

 

requests[pos].obj = new XMLHttpRequest();

也就是说在使用了一个XML文件获取数据后并没有即时释放文件的句柄。修改如下就可以了

 

function ajax_create_request(context)
{
    
var pos = requests.length;
    
    
if(pos<10)
    
{
        
for(var i=0; i<pos; i++)
        
{
            
if(requests[i].readyState == 4)
            
{
                requests[i].abort();
                requests[i].context 
= context;
                
return requests[i];
            }

        }


    }

    
else
    
{
        
for(var i=0; i<pos; i++)
        
{
            
if(requests[i].readyState == 4)
            
{
                requests[i].abort();
            }

            requests[i].obj 
= null;
            requests[i]
=null;
        }

        requests
=new Array();
        pos
=0;
    }

    
    requests[pos] 
= Object();
    requests[pos].obj 
= new XMLHttpRequest();
    requests[pos].context 
= context;
    
    
return requests[pos];
}

 

现在觉得通用性太好没有什么实际的意义,方言性的和本项目,或者说满足自己的需要最重要。不管怎么说,还是自己的编程习惯有问题,很多细节的问题没有注意。哎!吃一硷长一智吧!

以下是彩色图像的PSNRSSIMLPIPS和CIEDE2000评价算法的Matlab源码示例: 1. PSNR(峰值信噪比): ```matlab function psnr_value = PSNR(original, distorted) [M, N, ~] = size(original); mse = sum((original(:) - distorted(:)).^2) / (M * N * 3); max_value = max(original(:)); psnr_value = 10 * log10(max_value^2 / mse); end ``` 2. SSIM(结构相似性指数): ```matlab function ssim_value = SSIM(original, distorted) K1 = 0.01; K2 = 0.03; L = 255; C1 = (K1 * L)^2; C2 = (K2 * L)^2; original = double(original); distorted = double(distorted); mean_original = filter2(fspecial('gaussian', 11, 1.5), original, 'valid'); mean_distorted = filter2(fspecial('gaussian', 11, 1.5), distorted, 'valid'); var_original = filter2(fspecial('gaussian', 11, 1.5), original.^2, 'valid') - mean_original.^2; var_distorted = filter2(fspecial('gaussian', 11, 1.5), distorted.^2, 'valid') - mean_distorted.^2; cov_original_distorted = filter2(fspecial('gaussian', 11, 1.5), original .* distorted, 'valid') - mean_original .* mean_distorted; ssim_map = ((2 * mean_original .* mean_distorted + C1) .* (2 * cov_original_distorted + C2)) ./ ((mean_original.^2 + mean_distorted.^2 + C1) .* (var_original + var_distorted + C2)); ssim_value = mean2(ssim_map); end ``` 3. LPIPS(感知相似性指标):需要下载并使用LPIPS库,源码和使用说明可在https://github.com/richzhang/PerceptualSimilarity 找到。 4. CIEDE2000(CIE 2000色差公式):需要下载并使用CIEDE2000库,源码和使用说明可在https://www.mathworks.com/matlabcentral/fileexchange/46861-color-difference-cie-de2000 找到。 以上是基本的示例代码,用于评估图像质量的不同评价指标。你可以根据实际需求和图像数据进行适当的调整和修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值