WinCE下电阻式触摸屏的测试方法

     
很早以前在《四线电阻式触摸屏驱动之优化》一和被,介绍了TCC89平台触摸驱动的改建模式。实践注明,使用这道后,触摸屏几乎再为无出现跳笔的场地,达到了预期的目的。近年来YJUN在调节应用时,发现一个题目,怀疑同触摸屏驱动有涉嫌——触摸驱动在同样秒内及报给操作系统的罗列太少,导致界面呈现在滑行时不顶通。为了定量测试该参数,写了一个概括的略微器TSCApp.exe,界面如下图所出示。

每当贯彻API
Gateway过程中,另外一个用考虑的问题不怕是一对失利。这一个题材时有发生在分布式系统中当一个服务调用其余一个服务过或者未可用之动静。API
Gateway不应有让堵嘴并处于无限期等待下游服务之状态。不过,怎样处理这种败北依赖让特定的景色以及求实服务。要是是成品信息服务无响应,那么API
Gateway就活该受客户端再次回到一个错误。

图片 1

Ocelot 是一个使用.NET
Core平台上之一个API
Gateway,近来自家于与这项目标付出,开发完成首个就是使用波利(Polly)处理部分失败问题。各位同学或对波利(Polly)这一个类型不熟谙,先简单介绍下,波利是.NET基金会下之一个开源项目,波利(Polly)记录这多少个跨预设定的顶限值的调用。它实现了
circuit break格局,使得可以拿客户端起管响应服务之界限等待着已。假使一个劳务之错误率领先预设值,波莉(Polly)将中止服务,并且于一段时间内装有请求即刻失效,波莉可以啊请失败定义一个fallback操作,例如读取缓存或者再次回到默认值,有时候我们要调用其他API的时光现身小连接不通超时的场地,这立早晚吧得经波莉进行Retry,具体音信参考
http://www.thepollyproject.org/2016/10/25/polly-5-0-a-wider-resilience-framework/

     
图中之37/s意味的凡手写输入的灵敏度参数。在按部就班下触摸屏并疾速的滑行时,阅览该参数的轻重缓急,该值越怪征手写输入的灵敏度越强,该值越聊,表达手写输入的灵敏度越低,也就是说使用手写输入法时可能汇合现出笔迹不敷完善滑的情景。37/s略微低了一些,遵照老邓的说之,要死好的补助手写输入最好会到60左右,至少也抱50。用M8上测试了刹那间,它亦可顶86/s,如下图所展现。

Ocelot从贯彻达标来说就是平类别的中游件组合,在HTTP请求到达Ocelot,经过同多重之中间件的拍卖转发到下游的劳务,其中当调用下游服务之高中级件是HttpRequestBuilderMiddleware,通过调用HttpClient请求下游的HTTP服务,我们这边虽只要为HttpClient
的调用加上熔断器效用,代码参看https://github.com/TomPallister/Ocelot/pull/27/files
,紧要的一样段子代码如下:

     
图片 2 

using Ocelot.Logging;
using Polly;
using Polly.CircuitBreaker;
using Polly.Timeout;
using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace Ocelot.Requester
{
    public class CircuitBreakingDelegatingHandler : DelegatingHandler
    {
        private readonly IOcelotLogger _logger;
        private readonly int _exceptionsAllowedBeforeBreaking;
        private readonly TimeSpan _durationOfBreak;
        private readonly Policy _circuitBreakerPolicy;
        private readonly TimeoutPolicy _timeoutPolicy;

        public CircuitBreakingDelegatingHandler(int exceptionsAllowedBeforeBreaking, TimeSpan durationOfBreak,TimeSpan timeoutValue
            ,TimeoutStrategy timeoutStrategy, IOcelotLogger logger, HttpMessageHandler innerHandler)
            : base(innerHandler)
        {
            this._exceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking;
            this._durationOfBreak = durationOfBreak;

            _circuitBreakerPolicy = Policy
                .Handle<HttpRequestException>()
                .Or<TimeoutRejectedException>()
                .Or<TimeoutException>()
                .CircuitBreakerAsync(
                    exceptionsAllowedBeforeBreaking: exceptionsAllowedBeforeBreaking,
                    durationOfBreak: durationOfBreak,
                    onBreak: (ex, breakDelay) =>
                    {
                        _logger.LogError(".Breaker logging: Breaking the circuit for " + breakDelay.TotalMilliseconds + "ms!", ex);
                    },
                    onReset: () => _logger.LogDebug(".Breaker logging: Call ok! Closed the circuit again."),
                    onHalfOpen: () => _logger.LogDebug(".Breaker logging: Half-open; next call is a trial.")
                    );
            _timeoutPolicy = Policy.TimeoutAsync(timeoutValue, timeoutStrategy);
            _logger = logger;
        }

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            Task<HttpResponseMessage> responseTask = null;

            try
            {
                responseTask = Policy.WrapAsync(_circuitBreakerPolicy, _timeoutPolicy).ExecuteAsync<HttpResponseMessage>(() =>
                {
                    return  base.SendAsync(request,cancellationToken);
                });
                return responseTask;
            }
            catch (BrokenCircuitException ex)
            {
                _logger.LogError($"Reached to allowed number of exceptions. Circuit is open. AllowedExceptionCount: {_exceptionsAllowedBeforeBreaking}, DurationOfBreak: {_durationOfBreak}",ex);
                throw;
            }
            catch (HttpRequestException)
            {
                return responseTask;
            }
        }

        private static bool IsTransientFailure(HttpResponseMessage result)
        {
            return result.StatusCode >= HttpStatusCode.InternalServerError;
        }
    }
}

      看来触摸驱动确实还有进一步优化的必要,需要增强手写灵敏度参数。

地点代码我们采纳Policy.WrapAsync组合了熔断器和重试的蝇头单政策来化解有失败问题,思路好粗略,定义需要处理的要命出哪,比如
Policy.Handle<HttpRequestException>().Or<提姆eoutRejectedException>().Or<提姆(Tim)eoutException>(),当大出上用什么样处理,使用熔断器仍然重试,下面这几个代码当然为是切合调用第三正服务用了。

     
对于触摸屏驱动来说,除了手写灵敏度参数外,其余一个老要紧之题材就是是跳笔。测试跳笔的不二法门为深简短,轻按触摸屏,观望小红点是否发散,是否离开按下的职位。发散得更其厉害或去按下的职更远,就印证跳笔越严重。

接我们参加建设.NET
Core的微服务开发框架。从为项目Ocelot 点赞以及fork代码最先,一起来建设,端午本人已经给项目进献了2只特点的代码,服务意识同本文所言的熔断器。

     
触摸驱动之CPU占用率也是一个欲考虑的元素。下图是以TCC89平台及测试手写灵敏度参数时的Performance
Monitor截图。

https://www.cnblogs.com/lwqlun/p/8119856.html  

     
图片 3

      可以看,CPU的占用率一直于平稳,没有最好死之大起大落。

     
触摸屏测试小器的下载地址:http://files.cnblogs.com/we-hjb/TSCApp.rar