3层模式下长时间调用的进度条提示方案

2023-05-16

Winform + WCF  +IIS 方式

任务执行时间在几分钟,需要在客户端显示进度条,与提示

原理:客户端发出任务调用请求后,服务启用一个独立线程来执行,将执行过程与结果写入一个指定内存(消息存储桶)

客户端轮询服务端的消息存储桶,来获取进度或得到结果

 

客户端主要代码

进度控制参数类


    public class LongInvokeControl
    {
        public LongInvokeControl()
        {
            ShowPercent = true;
            LoopInterval = 1;
        }
        public LongInvokeControl(Object service, string sName, string lName):this()
        {
            this.Service = service;
            this.StartMethodName = sName;
            this.LoopMethodName = lName;
        }
        public String StartMethodName { get; set; }
        public String LoopMethodName { get; set; }
        public int LoopInterval { get; set; }
        public object Service { get; set; }
        public bool ShowPercent { get; set; }
    }  
View Code

客户端调用代码,反射+泛型方法


 public OutT LongInvoke<InT, OutT>(InT inParam, LongInvokeControl ctl)
        where OutT : class
        {
            try
            {
                using (var frm = new frmLongInvokeMonitor())
                {
                    var type = ctl.Service.GetType();
                    var methodStart = type.GetMethod(ctl.StartMethodName);
                    var r1 = methodStart.Invoke(ctl.Service, new object[] { inParam }) as LongInvokeBucketInfo;

                    var methodLoop = type.GetMethod(ctl.LoopMethodName);
                    var loopResponse = methodLoop.Invoke(ctl.Service, new object[] { r1 }) as LongInvokeResponse<OutT>;

                    ThreadPool.QueueUserWorkItem(o => {

                        while (loopResponse.Status == LongInvokeStatus.Running)
                        {
                            #region 设置显示属性
                            SyncContext.Send(obj =>
                            {
                                frm.progressBar1.Value = loopResponse.Percent ;
                                frm.txtTips.Text = loopResponse.Tips;
                            }, null);
                            #endregion
                            loopResponse = methodLoop.Invoke(ctl.Service, new object[] { r1 }) as LongInvokeResponse<OutT>;
                            Console.WriteLine(loopResponse.Tips);
                            Thread.Sleep(1000 * ctl.LoopInterval);
                        }
                        #region 关闭窗口
                        SyncContext.Send(obj =>
                        {
                            frm.Close();
                        }, null);
                        #endregion
                    },null);
                    //是否连续进度条
                    if (!ctl.ShowPercent)
                    {
                        frm.progressBar1.Style = ProgressBarStyle.Marquee;
                    }
                    frm.ShowDialog();

                    if (loopResponse.Status == LongInvokeStatus.Finish_Success)
                    {
                        Console.WriteLine("完成了!");
                        Console.WriteLine(loopResponse.Model);
                    }
                    else if (loopResponse.Status == LongInvokeStatus.Finish_Fail)
                    {
                        Console.WriteLine(loopResponse.Msg);
                    }
                    else
                    {
                        Console.WriteLine("状态异常!");
                    }
                    if (loopResponse.Status != LongInvokeStatus.Finish_Success)
                    {
                        throw new Exception(loopResponse.Msg);
                    }
                    return loopResponse.Model as OutT;

                }

 

            }
            catch (Exception ex)
            {
                if (ex.InnerException != null)
                {
                    throw ex.InnerException;
                }
                else
                {
                    throw;
                }
            }
        }  
View Code

使用代码


  barButtonItem1.ItemClick += (s, e) =>
            {
                var item = MainBindingSource.Current as LongInvokeBucketInfo;
                if (item == null) return;
                try
                {
                    var service=Fetch<ILongInvokeService>();
                    var ret = LongInvoke<List<int>, List<String>>(new List<int>() { 11, 2, 3 }, new LongInvokeControl(service, "TestTaskStartInvoke", "TestTaskLoopInvoke") { LoopInterval = 2,ShowPercent=false });
                    InfoMsg("任务执行完成" + ret[0]);
                }
                catch (Exception ex)
                {
                    ErrMsg(ex.Message);
                }
           
                return;
            };
            barButtonItem2.ItemClick += (s, e) =>
            {
                var item = MainBindingSource.Current as LongInvokeBucketInfo;
                if (item == null) return;
                try
                {
                    var service = Fetch<ILongInvokeService>();
                    var  ret = LongInvoke<List<int>, List<String>>(new List<int>() { 11, 2, 3 }, new LongInvokeControl(service,"TestTaskStartInvoke","TestTaskLoopInvoke") {LoopInterval=1 });
                    InfoMsg("任务执行完成" + ret[0]);
                }
                catch (Exception ex)
                {
                    ErrMsg(ex.Message);
                }

                return;
            };
            barButtonItem3.ItemClick += (s, e) =>
            {
                var item = MainBindingSource.Current as LongInvokeBucketInfo;
                if (item == null) return;
                try
                {
                    var service = Fetch<ILongInvokeService>();
                    var ret = LongInvoke<List<int>, List<String>>(new List<int>() { 101, 2, 3 }, new LongInvokeControl() { Service = service, StartMethodName = "TestTaskStartInvoke", LoopMethodName= "TestTaskLoopInvoke",ShowPercent= true });
                    InfoMsg("任务执行完成" + ret[0]);
                }
                catch (Exception ex)
                {
                    ErrMsg(ex.Message);
                }

                return;
            };  
View Code

 

服务端主代码:

消息存储桶,调用任务控制块,控制消息桶数量,也就控制了整个系统允许并发执行的总任务书

另外该类提供2个模板方法供WCF服务调用

一个WCF服务实现类,注意为完成进度跟踪需要实现2个方法


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Concurrent;
using F.Studio.Prime.EFModel;
using System.Threading;

namespace F.Studio.Prime.Service
{
    public class LongInvokeBucketMgr:IDisposable
    {
        private const int C_MaxSink = 50;
        private readonly static LongInvokeBucketMgr _Instance = new LongInvokeBucketMgr();       
        public List<LongInvokeBucket> BucketList = new List<LongInvokeBucket>();
        private Object lockObj = new object();
        public static LongInvokeBucketMgr Instance
        {
            get
            {
                return _Instance;
            }
        }
        private LongInvokeBucketMgr() 
        {
            InitMgr();
        }

        private void InitMgr()
        {
            for (int i = 0; i < C_MaxSink; i++)
            {
                var bucket=new LongInvokeBucket();
                bucket.Id=i;
                bucket.Model = null;
                bucket.Percent = -1;
                bucket.Status = LongInvokeStatus.Init;
                bucket.Tips = "";
                bucket.Msg = "";
                bucket.Code = -1;
                bucket.Guid = "";
                bucket.IsFree = true;
                BucketList.Add(bucket);
            }
        }

        public LongInvokeBucket Allocate()
        {
            lock (lockObj)
            {
                var it = BucketList.FirstOrDefault(ent => ent.IsFree == true);
                if (it == null) throw new Exception("没有可分配的消息存储桶!");
                it.IsFree = false;
                it.Guid = Guid.NewGuid().ToString();
                it.Status = LongInvokeStatus.Running;
                it.BTime = DateTime.Now;
                it.ETime = null;
                it.Code = 0;
                it.Percent = 0;
                it.Tips = "";
                it.Msg = "";
                it.Data = "";
                it.TaskName = "";
                it.Model = null;
                return it;
            }
        }
        public void Free(int id)
        {
            lock (lockObj)
            {
                var it = BucketList.FirstOrDefault(ent => ent.Id == id);
                if (it == null) throw new Exception(string.Format("指定的消息存储桶编号不存在{0}", id));
                it.IsFree = true;
                it.Model = null;
            }
        }
        public List<LongInvokeBucketInfo> GetList()
        {
           
                var list = new List<LongInvokeBucketInfo>();
                foreach (var item in BucketList)
                {
                    var info = new LongInvokeBucketInfo();
                    SetInfo(item, info);
                   
                    list.Add(info);
                }
                return list;
            
        }

        private static void SetInfo(LongInvokeBucket item, LongInvokeBucketInfo info)
        {
            info.BTime = item.BTime;
            info.ETime = item.ETime;
            info.Code = item.Code;
            info.Guid = item.Guid;
            info.Id = item.Id;
            info.IsFree = item.IsFree;
            info.Msg = item.Msg;
            info.Percent = item.Percent;
            info.Status = item.Status;
            info.TaskName = item.TaskName;
            info.Tips = item.Tips;
        }
        public static LongInvokeBucketInfo ConvertToInfo(LongInvokeBucket from)
        {
            LongInvokeBucketInfo info = new LongInvokeBucketInfo();
            SetInfo(from, info);
            return info;
        }
        public LongInvokeBucket QueryBucket(string guid)
        {
            var it= BucketList.FirstOrDefault(ent => ent.Guid == guid);
            if (it == null) throw new Exception("未找到指定的消息存储桶(运行控制块)!");
            return it;
        }

        public void Stop()
        {
            BucketList.Clear();
        }
        #region 执行与轮询模板代码
        /// <summary>
        /// 模板代码
        /// 需要提供Func方法实现,该方法输入LongInvokeBucket,返回ReturnT类型
        /// </summary>
        /// <typeparam name="ReturnT"></typeparam>
        /// <param name="func"></param>
        /// <returns></returns>
        public static LongInvokeBucketInfo StartInvoke<ReturnT>(Func<LongInvokeBucket, ReturnT> func)
        {
            var bucket = LongInvokeBucketMgr.Instance.Allocate();
            var taskInfo = LongInvokeBucketMgr.ConvertToInfo(bucket);
            var oldGuid = bucket.Guid;
            ThreadPool.QueueUserWorkItem(o =>
            {

                try
                {
                    bucket.Tips = "任务启动...";
                    var model = func(bucket);
                    bucket.Tips = "完成";
                    bucket.Percent = 100;
                    bucket.Code = 0;
                    bucket.Model = model;
                    bucket.Status = LongInvokeStatus.Finish_Success;

                }
                catch (Exception ex)
                {
                    bucket.Tips = "执行错误";
                    bucket.Msg = ex.Message;
                    bucket.Code = 2;
                    bucket.Status = LongInvokeStatus.Finish_Fail;
                }
                finally
                {
                    bucket.ETime = DateTime.Now;
                    Thread.Sleep(1000 * 10);
                    //10秒后世界依旧如故,那么就释放吧
                    if (bucket.Guid == oldGuid)
                    {
                        LongInvokeBucketMgr.Instance.Free(bucket.Id);
                    }
                }

            });
            return taskInfo;

        }
        public static LongInvokeResponse<ReturnT> LoopInvoke<ReturnT>(LongInvokeBucketInfo request)
        where ReturnT : class
        {
            var response = new LongInvokeResponse<ReturnT>();
            try
            {
                var bucket = LongInvokeBucketMgr.Instance.QueryBucket(request.Guid);

                if (bucket.IsFree) throw new Exception("已经释放了消息存储桶!");


                response.Tips = bucket.Tips;
                response.Status = bucket.Status;
                response.Percent = bucket.Percent;
                response.Code = bucket.Code;
                response.Msg = bucket.Msg;
                //立即释放
                if (bucket.Status == LongInvokeStatus.Finish_Success)
                {
                    response.Model = bucket.Model as ReturnT;
                    LongInvokeBucketMgr.Instance.Free(request.Id);
                }
                else if (bucket.Status == LongInvokeStatus.Finish_Fail)
                {
                    LongInvokeBucketMgr.Instance.Free(request.Id);
                }

            }
            catch (Exception ex)
            {
                response.Status = LongInvokeStatus.Finish_Fail;
                response.Code = 2;
                response.Msg = ex.Message;
                response.Tips = ex.Message;
            }
            return response;
        }

        /// <summary>
        /// 轮询调用,注意客户端检测到任务完成后,
        /// 请不要再发起调用
        /// </summary>
        /// <typeparam name="ReturnT"></typeparam>
        /// <typeparam name="InT"></typeparam>
        /// <param name="request"></param>
        /// <param name="act"></param>
        /// <returns></returns>
        public static LongInvokeResponse<ReturnT> LoopInvoke<ReturnT, InT>(LongInvokeRequest<InT> request, Action<LongInvokeBucket> act)
            where ReturnT : class
        {
            var response = new LongInvokeResponse<ReturnT>();
            try
            {
                var bucket = LongInvokeBucketMgr.Instance.QueryBucket(request.Guid);

                if (bucket.IsFree) throw new Exception("已经释放了消息存储桶!");
                if (act != null)
                {
                    act(bucket);
                }

                response.Tips = bucket.Tips;
                response.Status = bucket.Status;
                response.Percent = bucket.Percent;
                response.Code = bucket.Code;
                response.Msg = bucket.Msg;
                //立即释放
                if (bucket.Status == LongInvokeStatus.Finish_Success)
                {
                    response.Model = bucket.Model as ReturnT;
                    LongInvokeBucketMgr.Instance.Free(request.Id);
                }
                else if (bucket.Status == LongInvokeStatus.Finish_Fail)
                {
                    LongInvokeBucketMgr.Instance.Free(request.Id);
                }

            }
            catch (Exception ex)
            {
                response.Status = LongInvokeStatus.Finish_Fail;
                response.Code = 2;
                response.Msg = ex.Message;
                response.Tips = ex.Message;
            }
            return response;

        }
        #endregion
        #region IDisposable Members
        private bool disposed = false;
        /// <summary>
        /// Performs application-defined tasks associated with freeing, 
        /// releasing, or resetting unmanaged resources.
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Releases unmanaged and - optionally - managed resources
        /// </summary>
        /// <param name="disposing"><c>true</c> to release both managed 
        /// and unmanaged resources; <c>false</c> 
        /// to release only unmanaged resources.
        /// </param>
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    try
                    {
                        Stop();
                    }
                    catch
                    {

                    }
                }

                disposed = true;
            }
        }


        #endregion
    }
}  
View Code

 

注意下面func方法返回值是异步调用最终的返回值(看成同步调用时)

异步调用使用了ThreadPool线程,


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using F.Studio.Prime.IService;
using F.Studio.Prime.EFModel;
using System.Threading;
using System.ServiceModel.Activation;
using System.ServiceModel;

namespace F.Studio.Prime.Service
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    [ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, MaxItemsInObjectGraph = 999999999, IgnoreExtensionDataObject = true, UseSynchronizationContext = false)]
    public class LongInvokeService : ILongInvokeService
    {


        public List<LongInvokeBucketInfo> GetBucketList()
        {
            return LongInvokeBucketMgr.Instance.GetList();
        }

        public int Free(int id)
        {
            LongInvokeBucketMgr.Instance.Free(id);
            return 0;
        }
        
        public LongInvokeBucketInfo TestTaskStartInvoke(List<int> list)
        {
           Func<LongInvokeBucket, List<String>> func=(bucket)=>{
              #region
              // bucket.TaskName = "Long Invoke Test";
              // for (int i = 0; i < 10; i++)
              // {
              //     bucket.Tips = "执行" + i + "项操作...";
              //     bucket.Percent = bucket.Percent + 5;
              //     Thread.Sleep(1000 * 1);
              //     if (i > 5 && list[0] == 101) throw new Exception("碰到错误了,Func!");

              // }
              // bucket.Tips = "执行数据保存操作...";
              // bucket.Percent = 99;
              // Thread.Sleep(1000 * 3);
              // bucket.Tips = "任务执行完成";
               //return new List<String>() {"123","abc","ABC" };

              #endregion
               var actor= new TaskActor(bucket, list);
               actor.Do();
               return actor.Resulte;
           };
           return  LongInvokeBucketMgr.StartInvoke(func);
            
        }
        public LongInvokeResponse<List<String>> TestTaskLoopInvoke(LongInvokeBucketInfo request)
        {
            var response = LongInvokeBucketMgr.LoopInvoke<List<String>>(request);
            return response;
        }
        public LongInvokeResponse<List<string>> LoopTestTask(LongInvokeRequest<List<int>> request)
        {
            Action<LongInvokeBucket> act = (b) => 
            {
                if (request.Model.Count > 0)
                {
                    if (request.Model[0] == 101)
                    {
                        throw new Exception("Test:第一个元素是101");
                    }
                }
            };


            var response = LongInvokeBucketMgr.LoopInvoke<List<String>, List<int>>(request, act);
            return response;

        }
        public class TaskActor
        {
            private LongInvokeBucket _Bucket;
            private List<int> _List;
            public List<String> Resulte;
            public TaskActor(LongInvokeBucket bucket,List<int> list)
            {
                _Bucket = bucket;
                _List = list;
            }
            public void Do()
            {
                _Bucket.TaskName = "Long Invoke Test";
                for (int i = 0; i < 10; i++)
                {
                    _Bucket.Tips = "执行" + i + "项操作...";
                    _Bucket.Percent = _Bucket.Percent + 5;
                    Thread.Sleep(1000 * 1);
                    if (i > 5 && _List[0] == 101) throw new Exception("碰到错误了,Func!");

                }
                _Bucket.Tips = "执行数据保存操作...";
                _Bucket.Percent = 99;
                Thread.Sleep(1000 * 3);
                _Bucket.Tips = "任务执行完成";
                Resulte = new List<String>() { "123", "abc", "ABC","EFG" };
            }

        }
    }
}  
View Code

 


    public class LongInvokeBucket:LongInvokeBucketInfo
    {
        public LongInvokeBucket()
        {
            IsFree = true;
        }
        public void P(String tips)
        {
            this.Tips = tips;
        }
        public void P(String tips, int percent)
        {
            this.Tips = tips;
            this.Percent = percent;
        }
        public void P(int percent)
        {
            this.Percent = percent;
        }
            
    }

    public enum LongInvokeStatus { Init=-1,Running = 1, Finish_Success = 0, Finish_Fail = 2 }

    public class LongInvokeBucketInfo
    {
        public int Id { get; set; }
        public String TaskName { get; set; }
        public String Tips { get; set; }
        public int Percent { get; set; }
        /// <summary>
        /// 结束_失败
        /// 结束_成功
        /// 执行中
        /// </summary>
        public LongInvokeStatus Status { get; set; }
        public Object Model { get; set; }
        public String Guid { get; set; }
        public DateTime? BTime { get; set; }
        public DateTime? ETime { get; set; }
        /// <summary>
        /// 结果状态 
        /// 0:成功
        /// 其他执行失败
        /// </summary>
        public int Code { get; set; }
        public String Msg { get; set; }
        public bool IsFree { get; set; }
        public String Data { get; set; }
    }  
View Code

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3层模式下长时间调用的进度条提示方案 的相关文章

  • onlstm时间复杂度_CNN-LSTM | 一种融合卫星-雨量站降水数据的时空深度融合模型

    1 xff0c 不同模型的降水融合性能 表2 2001 2005年全国796个气象站不同降水校正模型的RMSE RB MAE和CC 如表2所示 xff0c 将4种模型结果与原TRMM数据进行了定量比较 xff0c RMSE和MAE值越小表明
  • app 后端技术

    app 后端技术 一直以来工作的方向是web server xff0c 对app server没有什么了解 虽然没有接触过移动app开发 xff0c 但对app后端技术还是挺有探索欲望的 xff0c app应用和web应用在前端的用户习惯不
  • GSM Hacking:使用BladeRF、树莓派、YatesBTS搭建便携式GSM基站

    每次看到黑客在网上发布的那些GSM技术相关文章我都十分惊讶 然而在没有Software Defined Radios SDRs 之前 xff0c 玩GSM并不便宜 xff0c 除此之外想要好好玩你得下大功夫 拓展阅读 GSM BTS Hac
  • 开发新产品的三个验证阶段(EVT/DVT/PVT)

    1 EVT Engineering Validation Test 是针对工程原型机的验证 xff0c 对象很可能是一大块开发板 xff0c 或是很多块开发板 xff1b 关键是要有足够时间和样品 通常 xff0c 如果是新平台 xff0c
  • 大麦盒子显示服务器超时,大麦盒子卡顿怎么办?这几个方法可以快速解决

    原标题 xff1a 大麦盒子卡顿怎么办 xff1f 这几个方法可以快速解决 根据研究表明 xff0c 目前家庭当中电视的使用时间依然在缓慢上升 xff0c 很多家庭会选购一款电视盒子 xff0c 让看电视的体验得到提升 xff0c 但网上很
  • 【转载】跨域请求出现preflight request失败的问题的解决

    本文转载自 xff1a https developer aliyun com article 753657 简介 xff1a 问题出现 这两天在项目联调过程中突然前端同学报告出现CORS跨域问题无法访问 刚听到很奇怪 xff0c 因为已经在
  • 什么是FSK制式?什么是DTMF制式?

    目前国内来电显示制式有FSK DTMF xff08 双音频 xff09 两种 xff0c 普通推广的是FSK 来电显示 又称 主叫号码显示 xff08 Calling Identity Delivery xff09 分为两种 xff1a 一
  • 【IntelliJ IDEA】idea显示工具栏

    idea显示工具栏 在view gt 勾选对应按钮即可
  • Windows Server 2016 路由和远程访问

    本次实验是将Windows Server 2016 配置成一个路由器 xff0c 为此网络上的客户端和服务器启用多重协议LAN到LAN xff0c LAN到WAN xff0c 虚拟专用网络和网络地址转换路由服务 使用路由和远程访问需配置下列
  • 如何理解Apache License, Version 2.0(整理)

    如何理解Apache License Version 2 0 xff08 整理 xff09 问题 xff1a 最近看到apache发布了2 0版本的License 而且微软也以此发布了部分源代码 我对OpenSource不是特熟 xff0c
  • 网页视频流m3u8/ts视频下载

    现在很多视频网站播放流视频 xff0c 都不是采用mp4 xff0f flv文件直接播放 xff0c 而是采用m3u8 ts这种方式播放 简单说就是 xff0c 网站后台把视频切片成成百上千个xx ts文件 xff0c 一般10秒一个 xf
  • Windchill的JSP页面跳转到Ext页面的分析

    今天花了一天时间 xff0c 看了一块代码 xff0c 低效但是不得不看懂 具体内容是这样的 xff1a Windchill中按钮菜单栏嵌入了一个菜单项 xff0c 点击它会触发弹出一个新的浏览器页面 xff0c 相当于弹框 xff0c 让
  • C++类的定义和声明怎么写

    C 43 43 语言可以看成是C语言的扩展和改进 xff0c 相对于C语言 xff0c C 43 43 语言主要是增添了面向对象的特性 类 xff08 Class xff09 则是C 43 43 面向对象编程的实现方式 无论是何种编程语言
  • jmeter-常用性能指标分析

    概述 我们在用jmeter做性能测试的时候 xff0c 有一些关键性的性能指标需要去分析 但是由于开源工具本身的局限性 xff0c 这些指标在工具中的命名极易对我们造成混淆 所以我们需要对这些指标一一进行剖析 指标分析 响应时间 xff1a
  • 讨论76 怎么查一下我机器的内存?AIX环境

    oracle大型数据库系统在AIX unix上的实战详解 讨论76 怎么查一下我机器的内存 xff1f AIX环境 一个读者来信问勒令一个简单问题 xff1a 怎么查一下我机器的内存 xff1f AIX环境 问题 xff0c 我这里借用or
  • 数组

    数据类型 数组名 61 new 数据类型 元素个数或数组长度 数组中最小的索引是 0 xff0c 最大的索引是 数组的长度 1 获得数组的长度 xff0c 提供了一个 length属性 xff0c 在程序中可以通过 数组名 length 的
  • 静态方法不需要有对象,可以使用类名调用

    Public static void printData 表明此类方法为类方法 xff08 静态方法 xff09 静态方法不需要有对象 xff0c 可以使用类名调用 静态方法中不允许访问类的非静态成员 xff0c 包括成员的变量和方法 xf
  • matlab练习程序(曲面拟合)

    这里用到的还是最小二乘方法 xff0c 和上一次这篇文章原理差不多 就是首先构造最小二乘函数 xff0c 然后对每一个系数计算偏导 xff0c 构造矩阵乘法形式 xff0c 最后解方程组 比如有一个二次曲面 xff1a z 61 ax 2
  • 高铁在高速运行时的电力是如何提供的?

    高铁在高速运行时的电力是如何提供的 xff1f 铁路机车是个庞大的家族 xff0c 高铁只是这个大家庭的一个新成员 xff0c 如果要连篇累牍赘述其他车辆 xff0c 恐怕这个答案是写不下的 xff0c 故本文针对高速铁路进行讨论 一 高铁
  • RS232通信协议详解

    通信协议 所谓通信协议是指通信双方的一种约定 约定包括对数据格式 同步方式 传送速度 传送步骤 检纠错方式以及控制字符定义等问题做出统一规定 xff0c 通信双方必须共同遵守 因此 xff0c 也叫做通信控制规程 xff0c 或称传输控制规

随机推荐

  • 学习C/C++的电子书大全

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在 学习C 43 43 的经典书籍 这篇文章中 xff0c 列出了C C 43 43 的经典书籍 xff1a C 43 43 Primer 第 5 版 中文版 英文版 Ef
  • 做Android开发的你还为找工作迷茫吗?通过直观的年薪来调准你的方向

    最近仍然有不少同学在找工作 xff0c 跳槽 现在跳槽不是一个好时机 可以看到现在的岗位明显减少了 很多公司都在赶今年的项目交付 xff0c 新的项目还没有规划好 xff0c 新一轮的融资也还没有到时间 很多在职的同学都在等到拿到年终奖再跳
  • 协议栈是什么

    1 协议栈是什么 简介 协议栈 xff0c 英语名称为Protocol stack xff0c 又称协议堆叠 xff0c 是计算机网络协议套件的一个具体的软件实现 协议套件中的一个协议通常是只为一个目的而设计的 xff0c 这样可以使得设计
  • 给linux杀杀毒吧

    linux是非常先进的 xff0c 但是没有绝对的安全 所以来杀杀毒吧 xff1a ClamAV是一个在命令行下查毒软件 xff0c 因为它不将杀毒作为主要功能 xff0c 默认只能查出您计算机内的病毒 xff0c 但是无法清除 xff0c
  • 服务器编程的语言,服务器编程语言的配置与CMS系统

    做过 1 服务器编程函数禁用找到 disable functions 61 该选项可以设置哪些服务器编程函数是禁止使用的 服务器编程中有一些函数的风险性还是相当大的 可以直接执行一些CentOS系统级脚本命令 如果允许这些函数执行 当服务器
  • Linux中断与进程切换,结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程...

    64 实验环境 OS Linux cj virtual machine 5 3 0 51 generic 虚拟机 QEMU 内核版本 5 3 4 调式方法 GDB PS xff1a 调试环境安装请看上一篇博客汇编级理解Linux系统调用 f
  • 【FreeRTOS】栈生长方向 portSTACK_GROWTH

    FreeRTOS新建任务时 xTaskCreate 函数有这样一段注释 span class token comment 代码已简化 span span class token comment If the stack grows down
  • 十大畅销【操作系统类】书籍,说说你看过哪本

    鸟哥的Linux 私房菜 深入理解计算机系统 Linux内核设计与实现 UNIX操作系统设计 操作系统是控制其他程序运行 xff0c 管理系统资源并为用户提供操作界面的系统软件的集合 操作系统 xff08 英语 xff1b Operatin
  • HP 阵列卡错误代码

    POST Error Messages The RAID Controller produces diagnostic error messages at reboot Many of these Power On Self Test PO
  • 我的2013 --那些划过生命线的人和事(大二.上)

    那些划过生命线的人和事 大二 上 又一次大清早被红马甲查赶出被窝 xff0c 让哥光着屁股就跑到隔壁宿舍去了 xff0c 真心恨死他们 这是一篇最早写于 2013 11 26 日的日志 xff0c 通过后来不断地增删改 xff0c 来总结
  • git提交到一半关闭时

    一 xff1a 出现问题 最近写东西 xff0c 在提交代码时 xff0c 突然出现一大推文件 忘记加 gitignore文件了 xff0c 导致所有的安装依赖也都上传了 所以 xff0c 点击了关闭按钮 xff0c 当下一次提交时 xff
  • 实录分享 | IBM马达:Kubernetes/Swarm on Mesos

    4月17日 xff0c Mesos爱好者在北京P2联合创业办公社迎来了第四次Mesos User Group约会 xff0c 下面是来自IBM马达的分享实录 作者介绍 xff1a 马达 xff0c IBM 高级软件工程师 xff0c Kub
  • 人工智能技术在呼叫中心的应用

    随着人工智能技术的不断发展 xff0c 研究成果被应用到各行各业 xff0c 今天我们主要分享一下人工智能技术在客户服务方面的应用 智能语音服务方面 xff1a 利用智能语音识别及分析技术 xff0c 在传统IVR基础上 xff0c 实时通
  • delphi开发回忆录——示例源码下载

    今天把最新的源码上传上来 xff0c 给有需要学习的朋友 xff0c 如果有朋友需要调试的话 xff0c 再向我要数据库 下载地址 xff1a http files cnblogs com edrp Demo rar
  • python异常继承树

    BaseException 43 SystemExit 43 KeyboardInterrupt 43
  • apk闪退 ncnn_README.md · benjaminwan/OcrLiteAndroidNcnn - Gitee.com

    ChOcrLiteAndroidOnnxToNcnn Demo APK下载 Gitee下载 https gitee com benjaminwan ocr lite android ncnn releases 介绍 Chineseocr L
  • 直立平衡车的姿态测量卡尔曼滤波算法原理与应用(附代码及调试截图)

    鄙人最近测量调试直立平衡车的姿态角度时 xff0c 用到了卡尔曼滤波算法 本着知其然还需知其所以然的学习精神 xff0c 在网上阅览了很多关于滤波原理及算法应用的文章 xff0c 加上自己的调试经验 xff0c 有了一点小小的心得 xff0
  • 【设计模式】我终于读懂了享元模式。。。

    祝大家开工大吉 x1f9e7 x1f9e7 x1f9e7 xff01 xff01 主页有红包哦 点这里 文章目录 祝大家开工大吉 x1f9e7 x1f9e7 x1f9e7 xff01 xff01 主页有红包哦 点这里 https blink
  • bus总线

    有时候两个组件也需要通信 xff08 非父子关系 xff09 当然Vue2 0提供了Vuex xff0c 但在简单的场景下 xff0c 可以使用一个空的Vue实例作为中央事件总线 eventBus js放在assets import Vue
  • 3层模式下长时间调用的进度条提示方案

    Winform 43 WCF 43 IIS 方式 任务执行时间在几分钟 xff0c 需要在客户端显示进度条 xff0c 与提示 原理 xff1a 客户端发出任务调用请求后 xff0c 服务启用一个独立线程来执行 xff0c 将执行过程与结果