精华内容
下载资源
问答
  • 经常开发ros环境的应该知道,当节点太多难以控制的时候,不如写个脚本直接启动...能否打开一个终端, 然后运行gnome-terminal有一些参数的要求,如下: -t 终端的标题 //注意,有些版本不支持 -e 可以出现多次 -x 只...

    经常开发ros环境的应该知道,当节点太多难以控制的时候,不如写个脚本直接启动多个节点(对应多个终端)。
    下面我们将介绍如何实现启动在多个终端下启动多个节点的方式
    我们先介绍一下终端的一些信息:
    终端输入:

    gnome-terminal
    

    能否打开一个终端,
    然后运行gnome-terminal有一些参数的要求,如下:

    -t  终端的标题    //注意,有些版本不支持
    -e 可以出现多次
    -x 只能出现一次,在-x后面的所有内容,均认为是要执行的命令,所以可以出现空格
    执行脚本后要保持标签不消失,需要加上exec bash 的命令,并用分号跟前面的命令隔开
    

    因此最终命令的样式如下:

    gnome-terminal -t "title" -x bash -c "roslaunch startup start.launch;exrc bash"
    
    

    了解上面后我们可以创建属于自己的脚本了。

    第一步:先创建一个脚本

    cd
    vi run_trx.sh
    

    其内容格式根据自己需要进行修改:

    #!/bin/bash
    
    source ~/Documents/ros/devel/steup.bash
    {
    gnome-terminal -t "start_robot" -x bash -c "roslaunch startup start.launch;exec bash"
    }&
    
    sleep 3s
    source ~/catkin_trx/devel/setup.sh
    {
    gnome-terminal -t "start_trx" -x bash -c "roslaunch asr_trx asr_trx.launch;exec bash"
    }&
    
    需要什么节点按照这个模块添加即可
    

    并且授权限:

    sudo chmod 755 run_trx.sh
    

    最后直接运行脚本文件即可:

    cd
    .run_trx.sh
    
    展开全文
  • 一个程序从源代码到可执行程序的过程

    万次阅读 多人点赞 2018-06-26 10:45:13
    一个程序一个执行程序的过程:预编译、编译、汇编、链接。 其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。 链接中,分为静态链接和动态链接...




    一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。
    其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。
    链接中,分为静态链接和动态链接,本文主要是静态链接。

    一、预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下
    1.删除所有的#define,展开所有的宏定义。
    2.处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
    3.处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
    4.删除所有的注释,“//”和“/**/”。
    5.保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
    6.添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。

    C语言的宏替换和文件包含的工作,不归入编译器的范围,而是交给独立的预处理器。
    C语言中源代码文件的文件扩展名为.c,头文件的文件扩展名为.h,经预编译之后,生成xxx.i文件。
    在C++,源代码文件的扩展名是.cpp或.cxx,头文件的文件扩展名为.hpp,经预编译之后,生成xxx.ii文件。

    二、编译:把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件。

    (结合程序来说明编译的几个步骤)
    有C语言的源代码如下:
    arr[3] = (a+4)*(3+8);

    1.词法分析:利用类似于“有限状态机”的算法,将源代码程序输入到扫描机中,将其中的字符序列分割成一系列的记号
    以上的一行C语言程序,一共有16个空字符,经扫描机扫描之后,产生了16个记号。lex可以实现词法分析。见下表:

    这里写图片描述

    见上图:
    词法分析产生的记号分类有:关键字、标识符、字面量(数字、字符串)、特殊符号(加号、等号等)

    2.语法分析:语法分析器对由扫描器产生的记号,进行语法分析,产生语法树。由语法分析器输出的语法树是一种以表达式为节点的树。上述的代码就是
    各种表达式的组合:赋值表达式、加法表达式、乘法表达式、数组表达式和括号表达式组成的复杂表达式。yacc可以实现语法分析,根据用户给定的规则(不同的编程语言对应不同的语法规则)对记号表进行解析。

    这里写图片描述

    见上图:
    整个语句被看作是一个“赋值表达式”,“=”左边是一个“数组表达式”,右边是一个“乘法表达式”。数组表达式又由两个符号表达式组成,符号表达式就是最小的表达式,之后同理。

    在语法分析的同时,就把运算符的优先级确定了下来,如果出现表达式不合法,——各种括号不匹配、表达式中缺少操作,编译器就会报错。

    3.语义分析:语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。
    其中,静态语义通常包括:声明和类型的匹配,类型的转换,那么语义分析就会对这些方面进行检查,例如将一个int型赋值给int*型时,语义分析程序会发现这个类型不匹配,编译器就会报错。

    经过语义分析阶段之后,所有的符号都被标识了类型(如果有些类型需要做隐式转化,语义分析程序会在语法树中插入相应的转换节点),见下图:

    这里写图片描述
    这个语句中的类型都是int型,无须做转换。

    4.优化:*源代码级别的一个优化过程*,例如该语句中的(3+8)的值可以在编译期确定,源代码优化器会将整个语法树转换成中间代码——语法树的顺序表示,十分接近目标代码。
    中间代码有很多种类型,最常见的是“三地址码”和“P-代码”,其中三地址码的基本形式为:x = y op z,表示将变量y和z进行op操作后,赋值给x,op操作可以是加减乘除等。
    经优化之后的语法树为:

    这里写图片描述

    该语句的三地址码:
    t1 = 3 + 8;
    t2 = a + 4;
    t3 = t2 * t1;
    arr[3] = t3;

    t1由数字11代替,省去t3,经优化或的三地址码为:
    t2 = a +4;
    t2 = t2 + 11;
    arr[3] = t2;

    另一个关于中间代码的要点:中间代码使得编译器可以被分成前端和后端,编译器前端负责产生与机器无关的中间代码,编译器后端将中间代码转换为机器代码。
    源代码优化去产生中间代码标志着下面的过程都属于编译器后端,后端主要包括:代码生成器和目标代码优化器。

    5.目标代码生成:由代码生成器将中间代码转换成目标机器代码,生成一系列的代码序列——汇编语言表示。

    6.目标代码优化:目标代码优化器对上述的目标机器代码进行优化:寻找合适的寻址方式、使用位移来替代乘法运算、删除多余的指令等。

    上述的六个步骤完毕之后,编译过程也就告一段落了。最终产生了由汇编语言编写的目标代码

    gcc把预编译和编译两个步骤合并成一个步骤。对于C语言的代码,是用“cc1”这个程序来完成这两步,对于C++代码,对应的程序为“cc1plus”。gcc这个命令只是后台程序的包装,根据不同的参数去调用:预编译编译程序——cc1,汇编器——as,连接器——ld。

    C语言的代码,经编译后产生的文件名为xxx.s。

    三、汇编:将汇编代码转变成机器可以执行的指令(机器码文件)。
    汇编器的汇编过程相对于编译器来说更简单,没有复杂的语法,也没有语义,更不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来,汇编过程有汇编器as完成。

    经汇编之后,产生目标文件(与可执行文件格式几乎一样)xxx.o(Windows下)、xxx.obj(Linux下)。

    但是,经过预编译、编译、汇编之后,生成机器可以执行的目标文件之后,还有一个问题——变量a和数组arr的地址还没有确定。这就需要链接器来搞定啦~

    四、链接:
    1、历史过程:曾经,程序猿门在编程时,使用纸带作为最原始的存储设备,每当程序需要修改时,都要重新扎一条纸带,扎孔的表示1,不扎的是0,一串串1和0就组成了各种各样的指令——跳转等等….
    每一次的修改都非常痛苦,所以先知们就发明了汇编语言,这种编程语言方便之处在于符号的引用,表示跳转指令不再需要记住一串串0和1,终于可以使用符号——foo来表示这个动作了!
    随着汇编语言的普及,程序的代码量也就开始快速膨胀了,汇编语言说它也撑不住了….不过还好,高级编程语言Fortran、C、C++等一个接一个地问世,语言越来越方便了,追求perfect的人们就想:代码咋写更好呢?可不可以把代码按照功能的不同,分成不同的部分,便于日后的修改和重复使用呢?
    有了这个启发,程序猿们越来越得心应手,他们开始把代码按照功能和性质划分,分别形成不同的功能模块,不同的模块之间又按照各种结构来组织。
    发展到如今,软件的规模越来越大,代码动辄数百万行代码,放在一个模块那是万万不行的,维护起来会非常麻烦,所有现在的大型软件往往拥有成千上万的模块,
    模块之间相互独立又相互依赖。
    新的问题来了,一个程序被分割成这么多模块,最后要怎么把这些模块组合形成一个单一的程序?
    答案就是:模块之间,符号的引用
    这就像是一张画有大树的拼图,叶子、枝干、根系都零散的分布在那些拼图碎片上,想要看到完整的大树,我们就会耐心地把那些碎片拼合在一起。

    这里写图片描述

    这些模块之间同样如此,它们依靠那些凸起和凹陷联系在一起,最终组合成一个完整的程序,这样的过程称为——链接。

    这样基于符号的模块化,使得链接过程在整个程序开发中显得十分重要和突出…..

    2、下面就静态链接,进行分析。
    1.链接:“组装”模块的过程。
    2.链接的内容:把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。(就像拼图,凸起和凹槽的位置一定一一对应,否则…)
    3.链接的过程:地址和空间的分配、符号决议(也叫“符号绑定”,倾向于动态链接)和重定位
    以gcc编译器为例,看基本的链接过程:

    这里写图片描述

    .c文件经过编译器、汇编器之后得到目标文件.o,目标文件再与库进行链接得到可执行文件.out。
    库其实就是一组目标文件的打包,这些目标文件中都是一些常用的代码。

    我们在fun.c模块中定义了函数foo(),在main.c模块中引用了foo()函数,在编译过程当中,编译器并不知道main.c中foo()的地址,所以将调用foo()的指令的目标地址部分搁置,
    等到了链接的阶段,链接器会去找到foo()定义的那个模块,在main.o中填入正确的函数地址,这个修改地址的过程被叫做“重定位”,每个被修正的地方叫“重定位入口”。

    这里写图片描述

    以上就是一个程序从源代码到可执行程序的大致过程,这是博主根据《程序员的自我修养——链接、装载与库》来整理的,有兴趣的同学可以自己去琢磨琢磨~





    原博客地址:https://blog.csdn.net/qq_39755395/article/details/78293733
    转载注明出处
    展开全文
  • 程序在渲染或者在操作请求时,如果响应很慢,会导致用户多次点击或者重复点击。另外也可能有用户多次连续点击请求,造成不是我们想要的结果。因此,需要设置禁止用户多次重复点击。在执行请求时,禁止多次点击或者...

    小程序在渲染或者在操作请求时,如果响应很慢,会导致用户多次点击或者重复点击。另外也可能有用户多次连续点击请求,造成不是我们想要的结果。因此,需要设置禁止用户多次重复点击。在执行请求时,禁止多次点击或者重复点击,放在工具util.js文件中

    /**
     * 执行请求,禁止多次点击或者重复点击
     */
    function showLoading(message) {
        if (wx.showLoading) {
            // 基础库 1.1.0 微信6.5.6版本开始支持,低版本需做兼容处理
            wx.showLoading({
                title: message,
                mask: true
            });
        } else {
            // 低版本采用Toast兼容处理并将时间设为20秒以免自动消失
            wx.showToast({
                title: message,
                icon: 'loading',
                mask: true,
                duration: 20000
            });
        }
    }
    
    function hideLoading() {
        if (wx.hideLoading) {
            // 基础库 1.1.0 微信6.5.6版本开始支持,低版本需做兼容处理
            wx.hideLoading();
        } else {
            wx.hideToast();
        }
    }
    

    在页面js:

    submit:function(){
        util.showLoading("数据请求中...");
        wx.request({
            url:url,
            data:data,
            success:(res)=>{
                util.hideLoading();
            },
            fail:()=>{
                util.hideLoading();
            }
        })
    }
    

    wxml:

    <view  bindtap="submit"></view>
    

    在页面跳转,禁止多次或者重复点击:

    /**
     * 
     */
    function isClicked(self) {
        self.setData({
            isClicked: true
        })
       
        setTimeout(function () {
            self.setData({
                isClicked: false
            })
        }, 500)
    }
    

    在对应页面中设置isClicked数据对象,

    js:

    Page({
        data:{
            isClicked:false
        },
        click:function(){
            util.isClicked(this);
        }
    })
    
    

    wxml:

    <view bindtap="{{!isClicked?'click':''}}"></view>
    
    展开全文
  • 连续点击,加载多次&lt;/text&gt; &lt;/view&gt; &lt;view bindtap="loadOnce"&gt;  &lt;text&gt;连续点击,加载次&lt;/text&gt; &lt;/v

    问题描述:

    1)wxml片段

    <view bindtap="loadMulti">
        <text>连续点击,加载多次</text>
    </view>
    <view bindtap="loadOnce">
        <text>连续点击,加载一次</text>
    </view>

    2)js代码片段

    loadMulti:function(e) {
        wx.navigateTo({
            url: '/pages/loadMulti/index',
        })
    },

    3)快速,连续点击“连续点击,加载多次”文本串时,我们会发现,目标页面loadMulti/index页面被加载了N次,需要点击N次返回,才可以返回到主页面。

    问题原因剖析:

            小程序基于MINA框架,该框架的核心框架的核心是一个响应的数据绑定系统,整个系统分为两块视图层(View)和逻辑层(App Service),框架可以让数据与视图非常简单地保持同步。当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新;当点击按钮的时候,视图层会发送 bindtap的事件给逻辑层,逻辑层找到对应的事件处理函数loadMulti执行。

            由于视图层发送bindtap事件给逻辑层并找到对应的处理函数需要时间T1,找到对应的处理函数loadMulti后,执行loadMulti函数:wx.navigateTo, hide 原页面,需要时间T2,如果在T1+T2时间内,快速连续点击N次,完全可以加载显示N次目标页面。

    解决方案:

      loadOnce:function(e) {
        if (!this.pageLoading) {
          this.pageLoading = !0;
          wx.navigateTo({
            url: '/pages/loadOnce/index',
          })
        }
      },
      onShow: function() {
        this.pageLoading = !1;
    }

    1)loadOnce事件处理函数中,设置pageLoading = true

    2)页面的onShow事件中,设置pageLoading = false



    展开全文
  • 最近执行一个python文件时发现,代码实际按照正常逻辑运行,但是多个代码段会重复执行多次,经查找相关资料,确定大致问题与import导入模块有关(但奇怪的是import某些模块会导致重复执行,有的则正常,后续待研究)...
  • 程序如何执行程序入口

    千次阅读 2016-03-22 16:17:38
    [摘要] 我们的程序进入到入口函数之前,是发生了很事情的。操作系统的安排,启动运行时库,运行时库再初始化好环境,然后启动你的入口函数,你的程序才正常的运行起来。等你的程序运行结束后,就退回到运行时库,...
  • JVM原理详解-Java程序执行过程

    万次阅读 多人点赞 2016-05-23 13:30:25
     Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。 Java虚拟机总是...
  • C++程序执行过程

    万次阅读 2018-01-26 00:24:52
    要理解一个程序执行过程,首先要理解什么是编译器。我们用C语言写的程序,计算机只能识别机器语言(二进制指令),计算机并不能理解。因此,必须 将C语言转换为机器语言。编译器就是用来实现这一功能的。编译器将...
  • 微信小程序navigator多次点击后无效

    千次阅读 2019-07-09 16:28:18
    刚学微信小程序,使用到navigator组件实现跳转出现了一个问题就是我点击我设置的button然后用navigator嵌套进去,开始每点击一button就可以跳转到相应的界面,重复操作四的时候,怎么点击都没反应了,纠结了好久...
  • 由于公司需要做一个对数据库服务器的监控程序,用的swing来实现的一个java桌面应用程序,所以需要将做好的监控程序打包成.exe文件,以便监控人员配置监控信息。所以研究了一下如何将Java程序打包成可执行程序,网上...
  • 单片机是没有上操作系统的东西,在keil中...这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。为何要加一句while死循环让程序停留在main函数中呢。将while(1);语句去掉有什么影响么? ...
  • JAVA线程程序开发基础知识

    万次阅读 2016-03-31 22:52:11
    JAVA线程基础 概念-程序、进程与任务 程序(program)是对数据描述与操作的代码的集合,是应用程序执行的...任务(multi task)在一个系统中可以同时运行程序,即有个独立运行的任务,每个任务对应一
  • 最近的项目过程中遇到了一些问题,需要在每天建立一个数据库表格记录相关信息,查找一些文章发现并不能实现对应功能,所以就依靠自己的想法在此献丑了,希望大神能够提出一些意见。 核心的思想就是用Qtimer定时器...
  • 设定每timer1分钟执行一次,为什么会被执行多次。代码如下: private void sjsxjk_Tick(object sender, EventArgs e) { if (!SJSXJKbgw.IsBusy) //每次此独立进程还没执行完,isbusy属性仍然是 false,这是为何...
  • 今天在弄微信小程序的时候使用到navigator组件实现跳转出现了一个问题就是我点击我设置的button然后用navigator嵌套进去,当没点击一button就可以跳转到相应的界面,当我重复四的时候问题出现了,不管我怎么点击...
  • Ajax 向同一个action发送多次请求

    千次阅读 2018-01-19 13:45:15
    简单总结,异步就是不会去等待服务端做出响应,只管发送,同步就是一发送对应一次响应。 依次向同一个Action发送个请求的时候,若有同步需求,可按照如下设置, //取消异步,执行一个post再继续 $.ajaxSet
  • 程序是如何执行的?

    千次阅读 2018-08-08 15:46:20
    本文是一个自己的体会,有很不精确的地方,目的是希望大家关注低层,修炼内功,读好书。 一直想写篇文章来说明在程序运行过程中操作系统都干了些什么事。下面我试着说明: 首先,任何程序都是有格式的,...
  • 问题描述 最近工作中碰到一个问题,在优化app,使用DDMS查看...自定义Application回调方法onCreate()被执行了3。开始不知是何原因。相关知识 android:process 从Android开发者文档中的manifest中进程配置android
  • 作为前端开发,我们经常会遇到的场景,比如用户点击获取验证码按钮时,没有反应,大部分用户都会接着...如何解决或避免这问题呢?一般来说有两种情况。 1、点击事件是执行网络请求(提交评论,验证码,支付) ...
  • CPU 执行程序的秘密,藏在了这 15 张图里

    千次阅读 多人点赞 2020-10-10 23:29:52
    代码写了那么,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗? 软件用了那么,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电脑上吗?64 位的操作系统可以运行在 32 位...
  • js定时器(执行一次、重复执行)

    万次阅读 2018-12-22 16:44:37
    1,只执行一次的定时器  &lt;script&gt; //定时器 异步运行 function hello(){ alert("hello"); } //使用方法名字执行方法 var t1 = window.setTimeout(hello,1000); var t2 = window....
  • 可以毫不夸张的说,几乎开发中绝大部分的MR程序都是基于wordcount编程模型而来,或者说用wordcount变化而来(改变的主要是业务方面的...1用户编写的程序分成三部分:Mapper,Reducer,Driver(提交运行mr程序的客户...
  • 简易JTAG烧写程序执行逻辑和流程

    千次阅读 2009-03-05 08:46:00
    简易JTAG烧写程序执行逻辑和流程本文摘自王洪辉老师的《嵌入式系统Linux内核开发实战指南(ARM平台)》书 网上有很种简易JTAG烧写程序,有用标准C写的,有用VC写的,有Windows系统下使用的版本,也有Linux...
  • 51单片机程序执行流程详细分析

    千次阅读 2020-02-26 11:51:40
    单片机是没有上操作系统...这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。为何要加一句while死循环让程序停留在main函数中呢。将while(1);语句去掉有什么影响么? 写一个很简单的程序...
  • 一次替换多个字符串,批量替换多个字符串

    万次阅读 热门讨论 2015-10-15 10:39:47
    以前用java开发的小工具为例,输入关键字【一次 替换 多个字符串】,在百度搜索里竟然找不到,翻了好几页也没有,2013年在百度搜索的第页能找到的。再试试关键字【一次查找替换文本中多个字符串】,还是不能找到。...
  • 思路很简单,类似于vue中给子组件加ref执行子组件方法道理一样,这里是给子组件加一 属性: id=“子组件名称”,比如: 然后在父组件对应的方法中直接 this.selectComponent("#list").getList(...
  • 小博客记录下,遇到过很多次情况,每次出现这情况的原因是清理了c盘 运行.bat文件就提示没有与之关联的程序执行该操作 错误截图如下: 如果遇到这种情况,我们只需要以管理员方式启动cmd,输入以下...
  • ignore_user_abort();//即使Client断开(如关掉... 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去 $interval=60*5;// 每隔5分钟运行 do{ $fp= fopen("test.txt

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 918,171
精华内容 367,268
关键字:

一个程序的多次执行的对应