精华内容
下载资源
问答
  • 线成下载断点续传

    2016-06-21 19:50:09
    了解一下多线程下载的思路 思路:开启多线程下载同一个文件,这样可以使我们的下载文件的速度加快。如果我们使用单一的线程去下载。下载速度慢。断点续传1.断点续传需要在下载过程中记录每线程的下载进度 2.每次...

    多线成下载断点续传

    1.了解一下多线程下载的思路

        思路:开启多个线程下载同一个文件,这样可以使我们的下载文件的速度加快。如果我们使用单一的线程去下载。下载速度慢。

    断点续传

    1.断点续传需要在下载过程中记录每条线程的下载进度
    2.每次下载开始之前先读取数据库,查询是否有未完成的记录,有就继续下载,没有则创建新记录插入数据库
    
    3.在每次向文件中写入数据之后,在数据库中更新下载进度
    
    4.下载完成之后删除数据库中下载记录
    

    多线程下载的步骤

    (1)首先获得下载文件的长度,然后设置本地文件的长度。
    HttpURLConnection.getContentLength();//获取下载文件的长度
    RandomAccessFile file = new RandomAccessFile(“QQWubiSetup.exe”,”rwd”);
    file.setLength(filesize);//设置本地文件的长度
    (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置。
    如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条线程开始下载的位置如
    例如10M大小,使用3个线程来下载,
    线程下载的数据长度 (10%3 == 0 ? 10/3:10/3+1) ,第1,2个线程下载长度是4M,第三个线程下载长度为2M
    下载开始位置:线程id*每条线程下载的数据长度 = ?
    下载结束位置:(线程id+1)*每条线程下载的数据长度-1=?
    (3)使用Http的Range头字段指定每条线程从文件的什么位置开始下载,下载到什么位置为止,
    如:指定从文件的2M位置开始下载,下载到位置(4M-1byte)为止
    代码如下:HttpURLConnection.setRequestProperty(“Range”, “bytes=2097152-4194303”);
    (4)保存文件,使用RandomAccessFile类指定每条线程从本地文件的什么位置开始写入数据。
    RandomAccessFile threadfile = new RandomAccessFile(“QQWubiSetup.exe “,”rwd”);
    threadfile.seek(2097152);//从文件的什么位置开始写入数据

    多线程下载断点续传的源码:

    /**
         * 开启线程的数量
         */
        static int threadCount=3;
        /**
         * 访问下载的路径
         */
        static String path="http://169.254.87.122:8080/baofeng.exe";
        static int threadFinished=0;
        public static void main(String[] args) {
            try {
                //创建URL对象  参数:设置路径
                URL url=new URL(path);
                //打开连接,通过强制类型转换HttpURLConnection
                HttpURLConnection connection=(HttpURLConnection) url.openConnection();
                //设置请求的方式
                connection.setRequestMethod("GET");
                //设置读取的时间
                connection.setReadTimeout(5000);
                //设置连接的时间
                connection.setConnectTimeout(5000);
                if (connection.getResponseCode()==200) {
                    //拿到要下载文件的大小
                    int length = connection.getContentLength();
                    //指定临时文件的路径和文件名
                    File file=new File(getFileName(path));
                    //创建随机存储文件对象
                    RandomAccessFile raf=new RandomAccessFile(file, "rwd");
                    //设置临时文件的大小和服务器的一模一样
                    raf.setLength(length);
                    //计算每个线程下载的字节数
                    int size=length/threadCount;
                    for (int i = 0; i <threadCount; i++) {
                        //计算3个线程的开始位置和结束位置
                        int startIndex=i*size;
                        int endIndex=(i+1)*size-1;
                        //如果是最后一个线程,那么结束位置特殊处理
                        if (i==threadCount-1) {
                            endIndex=length-1;
                        }
                        System.out.println("线程"+i+"-----------"+startIndex+"-------"+endIndex);
                        DowndLoadThread thread = new DowndLoadThread(i, startIndex, endIndex);
                        thread.start();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
        /**
         * 得到文件名字的
         * @param path 传入的访问的路径
         * @return 返回处理后的结果
         */
        public  static String getFileName(String path){
            //找到最后/的索引
            int index = path.lastIndexOf("/");
            //进行截取
            return path.substring(index+1);
    
        } 
        static class DowndLoadThread extends Thread{
            int threadId;
            int startIndex;
            int endIndex;
    
            /**
             * 创建有参构造函数
             * @param threadId 第几个线程的
             * @param startIndex 开始的索引
             * @param endIndex   结束的索引
             */
            public DowndLoadThread( int threadId,int startIndex, int endIndex) {
                super();
                this.startIndex = startIndex;
                this.endIndex = endIndex;
                this.threadId = threadId;
            }
    
            @Override
            public void run() {
                super.run();
                URL url;
                try {
                    //设置线程从那个位置开始写入数据到临时文件
                    File fileProgress=new File("h://"+threadId+".txt");
                    //判断下载的临时文件是否存在
                    if (fileProgress.exists()) {
                        FileInputStream fis=new FileInputStream(fileProgress);
                        BufferedReader br=new BufferedReader(new InputStreamReader(fis));
                        //拿到临时文件所存储的位置
                        int newStartIndex = Integer.parseInt(br.readLine());
                        startIndex=newStartIndex;
                        System.out.println("线程"+threadId+"最终位置---------------"+startIndex);
                    }
                    url = new URL(path);
                    HttpURLConnection connection=(HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setReadTimeout(5000);
                    connection.setConnectTimeout(5000);
                    //设置请求数据的范围
                    connection.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);
    
                    if (connection.getResponseCode()==206) {
                        InputStream is = connection.getInputStream();
                        int len=0;
                        byte[] b=new byte[1024];
                        int total=0;
                        File file=new File("h://"+MuiltDownLoad.getFileName(path));
                        //创建随机文件的存储对象
                        RandomAccessFile raf=new RandomAccessFile(file, "rwd");
                        raf.seek(startIndex);
                        //记录当前下载进度
                        int currentPosition=startIndex;
    
                        while((len=is.read(b))!=-1){
                            //把下载下来的临时文件写入raf临时文件
                            raf.write(b, 0, len);
                            total+=len;
                            @SuppressWarnings("resource")
                            RandomAccessFile rafProgress=new RandomAccessFile(fileProgress, "rwd");
                            currentPosition=startIndex+total;
                            //把下载进度写入rafProgress临时文件,下一次下载时作为新的startIndex
                            rafProgress.write((currentPosition+"").getBytes());
                            System.out.println("线程"+threadId+"---------------"+total);
                        }
                        raf.close();
                        System.out.println("线程"+threadId+"下载完毕");
                        MuiltDownLoad.threadFinished++;
                        //如果这个条件成立,说明线程下载完毕
                        synchronized (MuiltDownLoad.path) {
                            if (MuiltDownLoad.threadFinished==MuiltDownLoad.threadCount) {
                                for (int i = 0; i < MuiltDownLoad.threadCount; i++) {
                                    File temp=new File("h://"+i+".txt");
                                    temp.delete();
                                }
                                MuiltDownLoad.threadFinished=0;
                            }
                        }
    
    
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            }
        }
    
    展开全文
  • 当我们在VS 平台下调试模拟器的时候,苦于找不到设置断点的地方,所以快度找到常用断点的地方很重要.  1.在模拟器中使用断点 模拟器中断跟踪断点设置函数: // 触屏相关 wgui_touch_screen.c wgui_general_...
    当我们在VS 平台下调试模拟器的时候,苦于找不到设置断点的地方,所以快度找到常用断点的地方很重要. 

    1.在模拟器中使用断点

    模拟器中断跟踪断点设置函数:
    // 触屏相关 wgui_touch_screen.c
    wgui_general_pen_down_hdlr // 触摸屏按下函数
    wgui_general_pen_move_hdlr // 触摸屏移动函数
    wgui_general_pen_down_hdlr // 触摸屏松开函数
    wgui_general_pen_repeat_hdlr // 重复
    wgui_general_pen_abort_hdlr // 放弃操作

    在wingui.c 此函数中setup_UI_wrappers有相关全局变量的初始赋值和定义
    EntryNewScreen    // 进入一个新的screen都会调用的函数
    ExecuteCurrKeyHandler // 执行按键的函数
    ExecuteCurrHiliteHandler
    ExecuteCurrHiliteHandler_Ext // 执行当前高亮的函数
    ExecuteCurrProtocolHandler   //执行当前协议栈的函数
    execute_softkey_function   //执行softkey的函数
    UI_fill_rectangle       // 填充一个矩形框
    UI_draw_vertical_line     // 画一条垂直线
    UI_draw_horizontal_line    // 画一条水平线
    UI_draw_dotted_horizontal_line //水平虚线
    UI_draw_dotted_vertical_line // 垂直虚线
    UI_print_text         // 画一个字符串
    UI_print_bordered_text    // 画一个有边色字符串
    UI_print_text_n        // 画一个有n个字符的字符串
    UI_print_bordered_text_n // 画一个有n个字符的带边框色字符串
    UI_print_bordered_character //画一个的带边框色字符
    UI_print_character      //画一个字符
    gdi_image_draw        //从绘图事件开始跟踪的函数
    _show_image          // 画一个gif
    _show_transparent_image    //画有设透明色的图片
    _show_animation_frame     // 画设置祯数的图片
    gdi_layer_blt_previous    // 同一个layer刷新某一区域的函数
    gdi_layer_blt_ext       // 几个layer叠加显示时刷新某一区域的函数
    UI_BLT_double_buffer     //刷新一块区域
    UI_set_font          //设置字体
    3。在模拟器中设置变量值改变的断点
    4。搜索菜单ID 如MAIN_MENU_ENTERTAINMENT_MENU_ID
    5。搜索字符串ID如MAIN_MENU_MENU_TEXT
    6。搜索图片ID 如MAIN_MENU_PHONEBOOK_ICON
    7. 超级终端调试:
    8.Catcher调试

     

    2.MMI绘制设置断点

    跟踪屏幕每一处字串绘制:
    设置断点UI_move_text_cursor:
    gui_move_text_cursor =UI_move_text_cursor

    图标测量:
    设置断点_measure_image
    gui_measure_image = _measure_image


    图标显示:

    设置断点_show_image
    gui_show_image = _show_image

    水平线和垂直线的绘制:

    设置断点UI_draw_vertical_line和UI_draw_horizontal_line

    gui_draw_vertical_line = UI_draw_vertical_line;
    gui_draw_horizontal_line = UI_draw_horizontal_line;


    字串测量、坐标位置、打印:

    设置断点UI_print_text、UI_measure_string 、 UI_move_text_cursor
    gui_measure_string = UI_measure_string
    gui_move_text_cursor =UI_move_text_cursor
    gui_print_text =UI_print_text

     

    另外 EntryNewScreen()   dm_redraw_category_screen  也是非常有用的地方
    0
    展开全文
  • echarts图表断点连线的种解决方案

    万次阅读 2018-06-07 14:12:52
    先上图 图 图二可以看到,12号与18号这两天的点连线了,说一下解决方案。方案:使用dataZoom(与tooltip结合使用时不建议使用)ECharts的普通折线图是不能连接不连续点的,但是当加入dataZoom(...

    先上图

                                                图一

                                                    图二

    可以看到,12号与18号这两天的点连线了,说一下解决方案。

    方案一:使用dataZoom(与tooltip结合使用时不建议使用)

    ECharts的普通折线图是不能连接不连续点的,但是当加入dataZoom(数据区域缩放)属性就能连接了。
    将“show”设置为“false”可以隐藏缩放滚动条:
    dataZoom: [
    {
        type: 'slider',
        show: false,
        yAxisIndex: [0],
        left: '96%',
        bottom: '5%',
        start: 0,
        end: 100                       
    }]
    缺点:使用tooltip时,折线图外的那些y轴值为""这种空字符串的值,无法在tooltip上正常展示,全被折线最左端的点屏蔽了,碰到这种情况的朋友应该能理解我说的,这边没有准备复现问题的图片。

    方案二:对y轴数据进行编辑

    option = {
        title: {
            text: '双数值轴折线',
            subtext: '纯属虚构'
        },
        tooltip: {
            formatter: function(params) {
                return params.seriesName + ' : [ ' + params.value[0] + ', ' + params.value[1] + ' ]';
            }
        },
        legend: {
            data: ['数据1']
        },
        calculable: true,
        xAxis: [{
            type: 'category',
            axisTick: {
                interval: 0
            },
            data: ['2016-01', '2016-02', '2016-03', '2016-04', '2016-05', '2016-06', '2016-07', '2016-08', '2016-09', '2016-10', '2016-11', '2016-12']
        }],
        yAxis: [{
            type: 'value',
            axisLine: {
                lineStyle: {
                    color: '#dc143c'
                }
            }
        }],
        series: [{
            name: '数据1',
            type: 'line',
            data: [
                ['2016-01', 10],
                ['2016-03', 7],
                ['2016-05', 8],
                ['2016-06', 6],
                ['2016-11', 12],
                ['2016-12', 9]
            ]
        }]
    };

    把以上代码运行后可以看到,图表的断点是连线的,我们碰到的断点无法连线的问题是因为使用了如下数据

    series: [{
            name: '数据1',
            type: 'line',
            data: [

                ['2016-01', 10],

                ['2016-02', ""],

                ['2016-03', 7],

                ['2016-04', ""],

                ['2016-05', 8],
                ['2016-06', 6]

            ]

        }]


    或者类似这种数据

    series: [{
            name: '数据1',
            type: 'line',
            data: [

               10,"",7,"",8,6

            ]

        }]


    从这个角度看我们只要在传入数据前将折线图中y轴值为空的数值删除处理就可以使断点连接。

    缺点:

    当使用tooltip时,我们在y轴未设置数据的地方,如果想显示日期+该日无数据的提示框就很难做到了,因为该处是没有节点存在的。

    展开全文
  • 在debug时,最重要的是能够准确快速的定位代码,一般常用的如下种方式 1.在模拟器中使用断点 模拟器中断跟踪断点设置函数: // 触屏相关 wgui_touch_screen.c wgui_general_pen_down_hdlr // 触摸屏按下...

    在debug调试时你也许常常发现有思路如何改,但就苦于找不到要改的地方。所以快速的定位代码是至关重要。

    在debug时,最重要的是能够准确快速的定位代码,一般常用的有如下几种方式


    1.在模拟器中使用断点

    模拟器中断跟踪断点设置函数:
    // 触屏相关 wgui_touch_screen.c
    wgui_general_pen_down_hdlr // 触摸屏按下函数
    wgui_general_pen_move_hdlr // 触摸屏移动函数
    wgui_general_pen_down_hdlr // 触摸屏松开函数
    wgui_general_pen_repeat_hdlr // 重复
    wgui_general_pen_abort_hdlr // 放弃操作

    在wingui.c 此函数中setup_UI_wrappers有相关全局变量的初始赋值和定义
    EntryNewScreen    // 进入一个新的screen都会调用的函数
    ExecuteCurrKeyHandler // 执行按键的函数
    ExecuteCurrHiliteHandler
    ExecuteCurrHiliteHandler_Ext // 执行当前高亮的函数
    ExecuteCurrProtocolHandler   //执行当前协议栈的函数
    execute_softkey_function   //执行softkey的函数
    UI_fill_rectangle       // 填充一个矩形框
    UI_draw_vertical_line     // 画一条垂直线
    UI_draw_horizontal_line    // 画一条水平线
    UI_draw_dotted_horizontal_line //水平虚线
    UI_draw_dotted_vertical_line // 垂直虚线
    UI_print_text         // 画一个字符串
    UI_print_bordered_text    // 画一个有边色字符串
    UI_print_text_n        // 画一个有n个字符的字符串
    UI_print_bordered_text_n // 画一个有n个字符的带边框色字符串
    UI_print_bordered_character //画一个的带边框色字符
    UI_print_character      //画一个字符
    gdi_image_draw        //从绘图事件开始跟踪的函数
    _show_image          // 画一个gif
    _show_transparent_image    //画有设透明色的图片
    _show_animation_frame     // 画设置祯数的图片
    gdi_layer_blt_previous    // 同一个layer刷新某一区域的函数
    gdi_layer_blt_ext       // 几个layer叠加显示时刷新某一区域的函数
    UI_BLT_double_buffer     //刷新一块区域
    UI_set_font          //设置字体
    3。在模拟器中设置变量值改变的断点
    4。搜索菜单ID 如MAIN_MENU_ENTERTAINMENT_MENU_ID
    5。搜索字符串ID如MAIN_MENU_MENU_TEXT
    6。搜索图片ID 如MAIN_MENU_PHONEBOOK_ICON
    7. 超级终端调试:
    8.Catcher调试

     

    2.MMI绘制设置断点

    跟踪屏幕每一处字串绘制:
    设置断点UI_move_text_cursor:
    gui_move_text_cursor =UI_move_text_cursor

    图标测量:
    设置断点_measure_image
    gui_measure_image = _measure_image


    图标显示:

    设置断点_show_image
    gui_show_image = _show_image

    水平线和垂直线的绘制:

    设置断点UI_draw_vertical_line和UI_draw_horizontal_line

    gui_draw_vertical_line = UI_draw_vertical_line;
    gui_draw_horizontal_line = UI_draw_horizontal_line;


    字串测量、坐标位置、打印:

    设置断点UI_print_text、UI_measure_string 、 UI_move_text_cursor
    gui_measure_string = UI_measure_string
    gui_move_text_cursor =UI_move_text_cursor
    gui_print_text =UI_print_text


    绘制图片的函数:
    gdi_image_draw->gdi_image_codec_draw


    展开全文
  • LLDB在IOS断点调试

    千次阅读 2017-08-28 18:12:42
    LLDB阐述LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且...
  • 断点续传的原理

    千次阅读 2016-07-01 17:54:47
    断点续传是大型文件数据传输的核心。本文将以多线程技术和Socket技术为依托,介绍大型...在服务器端的服务程序监听数据传输请求,每当接到新的请求,则创建一个新的线程,与客户端的发送线程对应,接收数据,记录数据传
  • 断点续传原理

    2015-10-20 20:39:01
    比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/
  • Java 实现断点续传 (HTTP)

    千次阅读 2013-12-17 23:04:12
    公司需要用Java做断点续传的实现,没有接触过,不过根据自己的理解就是文件接着上次传输的继续完成传输,具体的操作看到IBM这位仁兄的例子确实帮了大忙了,感谢! 原文地址:...
  • Handle和多线程断点下载

    千次阅读 2012-11-18 03:12:31
    一般来讲服务器只允许同一IP同时开着3到5线程去下载一个资源。所以客户开着许多线程去下载不一定就很快! 注意: (1)为进度条设置样式:style="?android:attr/progressBarStyleHorizontal"其中?表示引用  ...
  • 用Java实现断点续传(HTTP)

    千次阅读 2005-07-21 13:08:00
    用Java实现断点续传(HTTP)内容:()断点续传的原理(二)Java实现断点续传的关键点(三)断点续传内核的实现关于作者钟华 (zhong_hua@263.net)Author name (email address)-->2001 年 5 月()断点续传的原理其实断点...
  • 来自专治PCB疑难杂症主群(群友突破1200人啦,添加杨老师微信号Johnnyyang206,可添加入群)的疑难杂症:位群友都问过:关于设计软件allegro出现截的线段,出现小方框的这问题,出现后移动线非常不...
  • JAVA 实现断点传输

    千次阅读 2011-09-27 13:31:09
    其实断点续传的原理很简单,就是在Http的请求上和一般的下载...打比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。 GET /down.zip HTTP/1.1 Ac
  • Fiddler - Fiddler命令行和HTTP断点调试

    千次阅读 2014-03-07 15:12:02
    上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的session不是同一个概念,这里的每HTTP请求都成为一个session)界面中可以看到Fiddler抓取的所有HTTP请求.而为了更加方便的管理所有...
  • 当然现在某些高端机子的处理器能力比较强了,就可以多开辟几条子线程。 2、为了实现断点下载,采用数据库方式记录下载的进度,这样当你将该应用退出后,下次点击下载的时候,程序会去查看该下载链接是否存在下载...
  • 用 Java 实现断点续传 (HTTP)

    千次阅读 2019-04-03 10:57:44
    比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 wwww.sjtu.edu.cn,文件名为 down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image...
  • Android实现多线程断点续传

    千次阅读 2014-07-31 21:47:15
    前言: 项目都快交付阶段了,客户说要改个需求,添加一个断点
  • 比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 www.sjtu.edu.cn,文件名为 down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, i
  • eCharts画图断点连线的解决方案

    千次阅读 2016-01-10 17:32:21
    由于公司产品的需要,最近几个月都在使用eCharts,功能还是很强大的,基本能够实现你想要的任何效果。但是在使用的过程中,碰到个eCharts本身不支持的功能,就是eCharts只画真实数据的点,没有真实数据的用”-...
  • Android多线程断点下载完整示例详解

    千次阅读 2013-10-03 20:14:12
    * 而且这些几个多余的字节是出现在最后一条下载线程中,它的终止位置已经 * 超过了原文件的末尾. * 这样就造成了下载的文件与原文件大小不一致. * 所以在下载过程中需要处理该情况,处理方式参见DownloadThread类 ...
  • 断点调试是Fiddler又强大和实用的工具之。通过设置断点,Fiddler可以做到: 1.修改HTTP请求头信息。例如修改请求头的UA,Cookie,Referer信息,通过“伪造”相应信息达到达到相应的目的(调试,模拟用户真实请求等...
  • Python断点调试方法

    万次阅读 2014-12-20 21:09:56
    Debug 对于任何开发人员都是项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug。python 提供了系列 debug 的工具和包,可供我们选择。本文将主要阐述如何利用 python debug 相关工具进行 debug...
  • windbg调试和断点学习总结2

    万次阅读 2016-12-13 10:56:53
    在windbg中,断点设置的地址形式好多种,可以是以下种: 1.虚拟地址:即给出直接地址,如 12345678 2.函数偏移量:如DriverEntry+5c. 3.源代码+行数 :`[[Module!]Filename][:LineNumber]` 4.对C++可以对...
  • Android_Service多线程断点下载

    千次阅读 2016-06-09 18:56:45
    Android中实现单线程下载文件是比较容易的,可是要使得自己的应用支持多线程断点下载就要考虑到很多细节了,今天我们起来探讨一下多线程断点下载时怎么实现的。 首先先画一张图说明一下Android中下载文件的大致...
  • JAVA实现断点续传

    2006-08-21 20:14:00
    ()断点续传的原理 其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,872
精华内容 5,148
关键字:

一条线有几个断点