精华内容
下载资源
问答
  • Qt实现只运行一个程序实例,即只能同时启动一个应用进程 QLockFile QSystemSemaphore QSharedMemory 前言 每次运行应用程序的一个实例可能是必要的,以限制内存泄漏的问题,或者消除某些资源,文件,SQLite数据库...

    Qt实现只运行一个程序实例,即只能同时启动一个应用进程 QLockFile QSystemSemaphore QSharedMemory

    前言
    每次只运行应用程序的一个实例可能是必要的,以限制内存泄漏的问题,或者消除某些资源,文件,SQLite数据库等应用程序的两个实例之间的竞争问题。或者,原则上,应用程序只需要用户使用一个副本就行了。

    有两种方法可以用来解决这个问题:

    1、使用QLockFile
    当一个临时文件被创建时,当应用程序关闭时清除这个临时文件。因此,在应用程序的第二个实例启动时检查该文件是否已经创建了一个打开的应用程序实例,如果这个文件存在那么第二个就可以不启动了。

    2、使用QSystemSemaphore和QSharedMemory
    这种通过创建一个共享内存段,并尝试将其连接到具有唯一标识符的现有段。如果连接尝试成功,则表明应用程序的一个实例已经创建。因此,我们通知用户并关闭应用程序。如果连接尝试不成功,那么我们为应用程序选择创建这个内存段并运行第一个实例。

    QLockFile
    在应用程序启动期间,创建一个临时“锁定文件”,如果尝试创建锁定文件不成功,则程序表明已经打开应用程序的一个实例,通知用户并关闭当前未启动的实例。 
    测试程序:

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        // 本测试程序id取名为SingleAppTest
        QString path = QDir::temp().absoluteFilePath("SingleAppTest.lock");
        // path = C:/Users/yu/AppData/Local/Temp/SingleAppTest.lock  
        QLockFile lockFile(path);

        bool isLock = lockFile.isLocked();
        // bool QLockFile::tryLock(int timeout = 0)
        // tryLock尝试创建锁定文件。此函数如果获得锁,则返回true; 否则返回false。
        // 如果另一个进程(或另一个线程)已经创建了锁文件,则此函数将最多等待timeout毫秒
        if (!lockFile.tryLock(100)) 
        {
            QMessageBox msgBox;
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.setText("The application is already running.\n"
                "Allowed to run only one instance of the application.");
            msgBox.exec();
            return 1;
        }

        SingleAppTest w;
        w.setFixedSize(250, 150);
        w.show();
        return a.exec();
    }


    使用QSystemSemaphore 和 QSharedMemory
    在上面的例子中,通过限制Qt应用程序运行实例的数量,给出了一个简单而方便的解决方案。 
    但是,在涉及用户权限方面场景时可能会有一些缺点。你想为整个计算机运行一个单个实例,并且多用户可以运行它,那么用QLockFile就提供不了这个能力了。

    QSharedMemory则相反,在计算机上工作的同时,所有用户共享。因此,如果你的任何用户先运行程序,后者将无法运行它。但是在这种情况下,有必要考虑不同平台共享内存的差异。 
    在Windows的情况下,共享内存将在程序正常完成时释放,并在突发情况下也能回收。在Linux/UNIX的情况下发生突发情况时崩溃后内存将无法释放。

    在下面的代码中,信号量用于在同时启动同一应用程序的多个实例的情况下解决竞争问题。 
    信号量由计数器创建,其最大数量为1. 
    当引发信号量时,应用程序的所有其他实例不再访问共享内存,因此一个实例完全拥有资源。此实例通过存在带有与此应用程序匹配的标识符的共享内存段来检查应用程序的另一个运行实例。该实例成功启动并创建共享内存段,以防它找不到关于该应用程序的另一个实例的信息。之后,信号量被丢弃,允许应用程序的其他实例尝试启动。

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);

        // 创建信号量
        QSystemSemaphore semaphore("SingleAppTest2Semaphore", 1);  
        // 启用信号量,禁止其他实例通过共享内存一起工作
        semaphore.acquire(); 

    #ifndef Q_OS_WIN32
        // 在linux / unix 程序异常结束共享内存不会回收
        // 在这里需要提供释放内存的接口,就是在程序运行的时候如果有这段内存 先清除掉
        QSharedMemory nix_fix_shared_memory("SingleAppTest2");
        if (nix_fix_shared_memory.attach()) 
        {
            nix_fix_shared_memory.detach();
        }
    #endif
        // 创建一个共享内存  “SingleAppTest2”表示一段内存的标识key 可作为唯一程序的标识
        QSharedMemory sharedMemory("SingleAppTest2");  
        // 测试是否已经运行
        bool isRunning = false;
        // 试图将共享内存的副本附加到现有的段中。
        if (sharedMemory.attach()) 
        {
            // 如果成功,则确定已经存在运行实例
            isRunning = true; 
        }
        else 
        {
            // 否则申请一字节内存
            sharedMemory.create(1); 
            // 确定不存在运行实例
            isRunning = false;     
        }
        semaphore.release();

        // 如果您已经运行了应用程序的一个实例,那么我们将通知用户。
        if (isRunning) 
        {
            QMessageBox msgBox;
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.setText("The application is already running.\n"
                "Allowed to run only one instance of the application.");
            msgBox.exec();
            return 1;
        }

        SingleAppTest2 w;
        w.setFixedSize(250, 150);
        w.show();
        return a.exec();
    }

    展开全文
  • 请输入第一个数:")) b = int(input("请输入第二个数:")) fuhao = input("请输入运算符号:+-*/") if fuhao == "+": print("%s%s%s=%s"%(a,fuhao,b,a+b)) elif ...
    a = int(input("请输入第一个数:"))
    b = int(input("请输入第二个数:"))
    fuhao = input("请输入运算符号:+-*/")
    if fuhao == "+":
    	print("%s%s%s=%s"%(a,fuhao,b,a+b))
    elif fuhao == "-":
    	print("%s%s%s=%s"%(a,fuhao,b,a-b))
    elif fuhao == "*":
    	print("%s%s%s=%s"%(a,fuhao,b,a*b))
    elif fuhao == "/":
    	if b == 0:
    		print("除数不能是0")
    	else:
    		print("%s%s%s=%s"%(a,fuhao,b,a/b))
    else:
    	print("符号输入有误!")
    

    a = int(input("请输入第一个数:"))
    b = int(input("请输入第二个数:"))
    fuhao = input("请输入运算符号:+-*/")
    if fuhao == "+":
        print("%s%s%s=%s"%(a,fuhao,b,a+b))
    elif fuhao == "-":
        print("%s%s%s=%s"%(a,fuhao,b,a-b))
    elif fuhao == "*":
        print("%s%s%s=%s"%(a,fuhao,b,a*b))
    elif fuhao == "/":
        if b == 0:
            print("除数不能是0")
        else:
            print("%s%s%s=%s"%(a,fuhao,b,a/b))
    else:
        print("符号输入有误!")

     

    运行结果:

    展开全文
  • 有些时候我们的程序虽然能够很好的完成安装,但是程序的配置工作可能需要其他的一些程序来辅助完成,如果不执行这些程序,主程序就不能很好的完成工作,甚至不能完成工作,一个很明显的例子是,目前许多程序是通过...

    有些时候我们的程序虽然能够很好的完成安装,但是程序的配置工作可能需要其他的一些程序来辅助完成,如果不执行这些程序,主程序就不能很好的完成工作,甚至不能完成工作,一个很明显的例子是,目前许多程序是通过NET技术开发的,这就要求计算机上必须安装有.net Framework,否则主程序运行不了,只有预先安装了NET Framework后主程序才能得以运行。这个时候可以通过Run段,指定程序完成安装后、在安装程序显示最终对话框之前要执行的程序。

    设想有个主程序为ipmsg.exe,初始化程序为init.exe,主程序必须在init.exe运行一次之后方可很好的运行,这个时候可以这样做(这里的init.exe是我随便找的一个文件,和ipmsg没有必然的联系,只是用来演示):

    DefaultDirName="E:\TEST"

    AppVersion=1.0

    Compression=lzma2/max

    ShowLanguageDialog=yes

     

    [components]

    Name: main; Description:"主程序(必选)";Types:full compact custom;Flags: fixed

    Name: data; Description:"数据文件";Types:full

    Name: help;Description:"帮助文件";Types:full compact

     

    [files]

    ;需要打包的文件

    Source: "F:\desktop\test\ipmsg.exe"; DestDir: "{app}";Components:main

    Source: "F:\desktop\test\init.exe"; DestDir: "{app}";Components:main

    Source: "F:\desktop\test\bin.dat"; DestDir: "{app}";Components:data

    Source: "F:\desktop\test\help.chm"; DestDir: "{app}" ;Components:help

    Source: "F:\desktop\test\readme.txt"; DestDir: "{app}";components:help;Flags:isreadme

    [run]

    Filename: "{app}\INIT.EXE";

    测试上面代码生成的打包文件,运行到最后出现finish之前,将会出现如下画面,后面的安装程序将挂起,等待run段下的程序执行完毕后方可继续运行。

    聪明的读者可能已经想到,使用该方法也可以实现readme的功能。这里再谈谈该段的各个参数:

    Filename:

    该参数是必须的,用于说明需要执行的文件,或者需要打开的文件夹。如果Filename不是可执行文件(.exe或.com)或批处理文件(.bat或.cmd),你必须在条目中使用shellexec标记,由上面的代码可知,这个参数可以包含常量。

    Description:

    仅在[Run] 段有效。这是条目的描述,可以包含常量,如果没有指明,将会使用默认的描述

    Parameters:

    程序的可选命令行参数,可以包含常量例如有的控制台程序需要传递参数,这个时候就可以使用该参数了,示例如下:

    Filename: "{app}\INIT.EXE";Description:"初始化程序";Parameters:"/t"

    注意:如果你的程序不接受参数,传递的参数将会被忽略。

    WorkingDir

    程序在哪个目录启动。如果这个参数未指定则使用Filename参数中的目录。如果Filename 不包含路径,它将使用默认目录。这个参数可以包含常量。

    StatusMsg

    仅在[Run] 段有效。由于某些程序在执行期间是不可见的(处于安全或者其他原因),但是又不想让用户以为安装程序没有响应,可以通过该参数指定程序执行时显示在向导页的消息,如果这个参数未指定可是空白的,将使用默认的消息“正在完成安装...”。这个参数可以包含常量。例如下例:

    [run]

    Filename: "{app}\INIT.EXE";Description:"初始化程序"; StatusMsg:"别急,等一下就好"

    则效果如下:

    Flags:

    这个参数是额外选项设置。多个选项可以使用空格隔开。支持下面的选项:

    选项

    说明

    hidewizard

    如果指定了这个标记,向导将在程序运行期间隐藏

    nowait

    如果指定了这个标记,它将在处理下一个[Run] 条目前或完成安装前不等待进程执行完成,不能与waituntilidle或waituntilterminated 组合使用

    postinstall

    仅在[Run] 段有效。告诉安装程序在安装完成向导页创建一个选择框,用户可以选中或不选中这个选择框从而决定是否处理这个条目。以前这个标记调用showcheckbox。如果安装程序已经重新启动了用户的电脑 (安装了一个带restartreplace标记的文件或如果[Setup]段的AlwaysRestart指示是yes 引起的),选择框没有机会出现,因此这些条目不会被处理。

    runhidden

    如果指定了这个标记,它将在隐藏窗口中运行程序。

    runmaximized

    如果指定了这个标记,将在最大化窗口运行程序或文档

    runminimized

    如果指定了这个标记,将在最小化窗口运行程序或文档。

    shellexec

    如果Filename 不是一个直接可执行文件(.exe或.com 文件),这个标记是必需的。当设置这个标记时,Filename可以是一个文件夹或任何已注册的文件类型,当使用shellexec标记时,将不等待,直到生成的进程终止,如果确实需要,则必须添加标记waituntilterminated

    skipifdoesntexist

    如果这个标记在[Run] 段中指定,如果文件名不存在,安装程序不显示错误消息;如果这个标记在[UninstallRun]段中指定,如果文件名不存在,卸载程序不显示“一些元素不能删除”的警告

    skipifnotsilent

    仅在[Run] 段有效。告诉安装程序如果安装程序未在后台运行则跳过这个条目

    skipifsilent

    告诉安装程序如果安装程序在后台运行则跳过这个条目

    unchecked

     

    告诉安装程序初始为不选中选择框。如果用户希望处理这个条目,可以通过选取选择框执行,如果postinstall标记未同时指定,这个标记被忽略

    waituntilidle

    如果指定了这个标记,它将在未输入期间等待,直到进程等待用户输入,而不是等待进程终止。(调用WaitForInputIdle Win32函数。)不能与nowait或waituntilterminted 组合使用

    waituntilterminated

    如果指定这个标记,将等待到进程完全终止。注意这是一个默认动作 (也就是你不需要指定这个标记),除非你使用了shellexec标记,在这种情况下,如果你要等待,需要指定这个标记。不能与nowait或waituntilidle 组合使用

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

    万次阅读 多人点赞 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
    转载注明出处
    展开全文
  • Windows程序以特定用户身份运行

    千次阅读 2017-11-06 13:45:00
    如果一个程序需要访问文件服务器的共享目录,却不能让执行这个程序用户访问这个共享目录,怎么办? 解决方法:使用runas命令。 具体做法是,在本地先创建一个文件服务器授权了的用户abc,然后在控制台执行下面...
  • 出现这样问题都是先获取用户信息wx.getUserInfo()encryptedData与iv,再进行登录wx.login()获取code,code是用来生成session_key用来解密encryptedData与iv的,所以等你先获取用户encryptedData与iv时再获取code...
  • 在Linux下简单编写、编译并执行一个C语言程序

    万次阅读 多人点赞 2013-12-02 23:58:47
    C语言用法不是本文介绍的关键,本文只是引入如何第一次在linux系统下编写、编译和执行一个简单的c程序。学会后请自行深入。 = 前提基础 = Linux系统的路径写法有两种,一种是相对路径一种是绝对路径。 绝对...
  • 、什么是命令行(Windows下)?  命令行(Command Processor)(CMD)是在OS / 2 , Windows CE与Windows NT平台为基础的操作系统(包括Windows 2000,Windows XP,Windows Vista,Windows Server 2003,Windows ...
  • Python模拟一个用户登录系统

    万次阅读 2018-06-25 15:06:03
    题目:模拟一个用户登录系统,用户输入用户名和密码,输入正确即可进入系统直接上代码:#模拟一个用户登录系统,用户输入用户名和密码,输入正确即可进入系统 d=['yao','123456'] while 1: name =input("请...
  • 任务管理器(启动)——性能——资源监视器——CPU——关联的句柄——输入文件名——停止运行出现的所有程序
  • 、实现的效果 不看下效果,你们怎么有...(当然以前有点点基础)弄得代码不完善,运行处错了。 好了效果看完了,不废话,让我们开始吧。 二、准备工作 1、获取你的python.exe的路径 如上图右键IDLE–属性–...
  • stm32在sdram内运行用户程序
  • C ++可以对应用程序进行高级编程,也可以对硬件相关的库的低级编程,实现更底层的操作,这种特性为C++编程提供了极大的灵活性,允许开发人员精确控制资源消耗和性能,从而实现程序的最佳性能。 不同的平台提供了不同...
  • Windows下以其他用户身份运行程序

    万次阅读 2012-08-07 10:58:30
    runas /savecred /usr:administrator "C:\Program Files\SogouExplorer\sogouexplorer.exe" ... 从 Windows 2000 开始,微软的视窗操作系统开始提供给当前登录用户以不同的用户身份来
  • PHP定时器实现每隔几秒运行一次

    万次阅读 2016-03-04 10:11:43
    PHP定时器实现每隔几秒运行一次,下面写简单例子来讲解这方法。 ignore_user_abort();//关闭浏览器仍然执行 set_time_limit(0);//让程序一直执行下去 $interval=3;//每隔一定时间运行 do{  $msg=date(...
  • iOS 如何让一个程序在后台运行不被挂起,不死掉前言:这是本人的第一篇博客,本来对这种写...苹果后台运行的原理大家都知道,当一个程序进入后台时,除了一些特定的操作比如用户的音频,定位等能够在info.plist里修改
  • 程序(进程)在cpu中的执行过程

    万次阅读 多人点赞 2018-09-30 10:59:10
    渣理解: 内存 CPU 进程 程序 ...程序编译好后,存于某个地方(外存), ...那我fork一个进程又是什么回事??? 复制与当前程序(进程)一模一样的资源与代码???丢到进程调度队列那里去,让它有...
  • 入门学习Linux常用必会60命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    Linux 是一个真正的多用户操作系统,可以同时接受多个用户登录,还允许一个用户进行多登录。这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统...
  • 【深入理解计算机系统】程序是如何运行

    万次阅读 多人点赞 2017-11-05 20:53:14
    程序是如何运行的现代计算机存储和处理的信息以二值信号表示,程序对于计算机而言就是串二进制数据流,以流水线的方式进入CPU进行运算。主要在;CPU与内存之间进行数据传递。本文将从程序源码的结构与表现形式开始...
  • 编写一个控制台应用程序完成下列功能,并回答提出的问题。1) 创建一个类A,在构造函数中输出“A”,再创建一个类B,在构造函数中输出“B”。2) 从A继承一个名为C的新类,并在C内创建一个成员B。不要为C创建构造...
  • 我这么说的原因在于这译法完全扭曲了书的本意。如果直译原书名,应该是类似于“以程序员的视角理解计算机系统”,何来“深入”二字。可能在国内编辑看来,这是讲系统的,用C和汇编语言的,因此很“深入”,但我...
  • 一次微信小程序源码反解包

    万次阅读 2018-07-06 11:58:57
    安装完成后在安装目录下新建两文件夹: node-cache node-global (这是用来放npm全局模块的安装目录,也可以放到其他地方。) 二 配置环境变量 变量名:NODE_HOME 变量值(你的安装目录):C:\Program Files\...
  • 51单片机程序执行流程详细分析

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

    千次阅读 2017-05-26 18:14:03
    最近在研究一个VC界面库DuiLib,在细读它的源码时遇到些问题,比如 它的界面是如何绘制上去的,底层操作是如何实现的,就是CreateWindow和 ShowWindow又是如何实现的, 也不得而知, 因此我想有必要重新认识下Win...
  • 程序用户登录状态检查与更新实例

    万次阅读 热门讨论 2018-05-30 14:44:08
    这篇文章主要解决以下问题:用户每次登录小程序(包括第一次使用)及点击小程序的每页面的时候,我们如何判断他当前的登录状态是否过期?如果过期,如何重新获取用户信息并发送至开发者服务器更新用户信息,以及...
  • 微信小程序开发总结与心得()

    万次阅读 多人点赞 2019-02-25 14:54:34
    真的是一个很好用的bug监控费服务,众多大佬公司都在使用。 0 前言 最近的工作重心一直在小程序,也开发了几个小程序,对小程序开发的流程及相关技术相对比较熟悉,在开发过程中也总结了一些心得经验、了解一些小...
  • 在Android Studio的第2部分中,您使用Android Studio创建了第一个动画移动应用程序。现在,第3部分将带您完成在Android模拟器或真实设备中构建和运行应用程序的步骤。 我们将首先使用Gradle构建应用程序的应用程序包...
  • 使用Java实现一元二方程求根计算器

    万次阅读 多人点赞 2018-05-21 14:20:43
    使用Java编写一个程序实现一元二方程的求根,用户可以自行输入一元二方程各个参数的值,并通过该程序进行求根。在编写该程序之前首先需要学会编写一个“应声虫”程序,并在此基础上实现参数的手动输入。 2、...
  • 背景  Windows本退休了,换了Mac上岗,使用习惯上还在适应中,之前使用的一款工具软件在最近一次开机后不能... 想想近期系统无升级,程序在上一次运行时勾选了一个选项而已。遂重装了该工具程序,步骤如下: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,005,091
精华内容 402,036
关键字:

一次只完成一个用户程序的执行