精华内容
参与话题
问答
  • 操作系统-定时任务

    2019-08-10 16:21:50
    解决Ubuntu系统上 No command ‘crond’ found Linux(Ubuntu)定时提醒/执行任务 ubuntu 下执行定时任务 Java中定时任务的实现-Quartz Golang中定时任务的实现 Python中定时任务的实现-airflow ...

    Linux中定时任务的实现-crontab

    Linux学习 -->解决Ubuntu系统上 No command ‘crond’ found
    Linux(Ubuntu)定时提醒/执行任务
    ubuntu 下执行定时任务

    Java 定时任务-XXL-JOB

    XXL-JOB 分布式任务调度平台

    2.3 配置部署“调度中心”

    调度中心项目:xxl-job-admin
    作用:任务调度中心、任务管理后台

    步骤一:调度中心配置

    调度中心配置文件地址:/xxl-job/xxl-job-admin/src/main/resources/application.properties
    调度中心配置内容说明:

    ### web
    server.port=8080
    server.servlet.context-path=/xxl-job-admin
    
    ### actuator
    management.server.servlet.context-path=/actuator
    management.health.mail.enabled=false
    
    ### resources
    spring.mvc.servlet.load-on-startup=0
    spring.mvc.static-path-pattern=/static/**
    spring.resources.static-locations=classpath:/static/
    
    ### freemarker
    spring.freemarker.templateLoaderPath=classpath:/templates/
    spring.freemarker.suffix=.ftl
    spring.freemarker.charset=UTF-8
    spring.freemarker.request-context-attribute=request
    spring.freemarker.settings.number_format=0.##########
    
    ### mybatis
    mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
    #mybatis.type-aliases-package=com.xxl.job.admin.core.model
    
    ### xxl-job, datasource	数据库配置
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    ### datasource-pool
    spring.datasource.type=com.zaxxer.hikari.HikariDataSource
    spring.datasource.hikari.minimum-idle=10
    spring.datasource.hikari.maximum-pool-size=30
    spring.datasource.hikari.auto-commit=true
    spring.datasource.hikari.idle-timeout=30000
    spring.datasource.hikari.pool-name=HikariCP
    spring.datasource.hikari.max-lifetime=900000
    spring.datasource.hikari.connection-timeout=10000
    spring.datasource.hikari.connection-test-query=SELECT 1
    spring.datasource.hikari.validation-timeout=1000
    
    ### xxl-job, email	预警邮箱
    spring.mail.host=smtp.qq.com
    spring.mail.port=25
    spring.mail.username=2289200570@qq.com
    spring.mail.from=2289200570@qq.com
    spring.mail.password=GXFQQDL19950313
    spring.mail.properties.mail.smtp.auth=true
    spring.mail.properties.mail.smtp.starttls.enable=true
    spring.mail.properties.mail.smtp.starttls.required=true
    spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
    
    ### xxl-job, access token
    xxl.job.accessToken=
    
    ### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
    xxl.job.i18n=zh_CN
    
    ## xxl-job, triggerpool max size
    xxl.job.triggerpool.fast.max=200
    xxl.job.triggerpool.slow.max=100
    
    ### xxl-job, log retention days
    xxl.job.logretentiondays=30
    

    步骤二:部署项目

    如果已经正确进行上述配置,可将项目编译打包部署;当然,也可直接本地启动,启动项目时,一定要先配置日志——logback.xml。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false" scan="true" scanPeriod="1 seconds">
    
        <contextName>logback</contextName>
        <property name="log.path" value="/media/fly/D/JavaProjects/xxl-job/logs/xxl-job-admin.log"/>
    
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${log.path}</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
                </pattern>
            </encoder>
        </appender>
    
        <root level="info">
            <appender-ref ref="console"/>
            <appender-ref ref="file"/>
        </root>
    
    </configuration>
    

    调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址),默认登录账号 “admin/123456”

    2.4 配置部署“执行器项目”

    步骤一:maven依赖

    确认pom文件中引入了 “xxl-job-core” 的maven依赖;

    <!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>${最新稳定版本}</version>
    </dependency>
    

    步骤二:执行器配置

    执行器配置,配置文件地址:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
    执行器配置,配置内容说明:

    # web port
    server.port=8081
    # no web
    #spring.main.web-environment=false
    
    # log config
    logging.config=classpath:logback.xml
    
    
    ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
    ### xxl-job 任务调度中心的地址
    xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
    
    ### xxl-job, access token
    xxl.job.accessToken=
    
    ### xxl-job executor appname
    xxl.job.executor.appname=xxl-job-executor-sample
    ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
    xxl.job.executor.address=http://127.0.0.1:9999
    ### xxl-job executor server-info
    xxl.job.executor.ip=127.0.0.1
    xxl.job.executor.port=9999
    ### xxl-job executor log-path
    xxl.job.executor.logpath=/media/fly/D/JavaProjects/xxl-job/logs/jobhandler
    ### xxl-job executor log-retention-days
    xxl.job.executor.logretentiondays=30
    

    步骤四:部署执行器项目

    出现 java.net.MalformedURLException: no protocol 异常的原因及解决方法

    Java 定时任务-Quartz

    Golang中定时任务的实现——github.com/robfig/cron

    使用范例

    golang cron 定时任务使用
    Gin实践 连载十一 Cron定时任务
    github.com/robfig/cron【Golang 常用包推荐】
    golang版的crontab
    golang crontab的计划任务及定时任务使用
    Go cron定时任务的用法

    Python中定时任务的实现-airflow

    展开全文
  • 系统任务

    2020-05-04 20:45:44
    对于当前正在运行的程序 systemctl命令 作用 systemctl start 启动服务 systemctl stop 停止服务 systemctl restart 重启服务 systemctl reload 重新加载配置 systemctl status 查看服务运行状态 ...

    对于当前正在运行的程序

    systemctl命令			作用
    systemctl start 		启动服务
    systemctl stop 			停止服务
    systemctl restart 		重启服务
    systemctl reload 		重新加载配置
    systemctl status 		查看服务运行状态
    systemctl is-active 	查看服务是否在运行中
    systemctl mask 			禁止服务运行
    systemctl unmask 		取消禁止服务运行
    

    守护进程的状态

    状态				描述
    loaded			服务单元的配置文件已经被处理
    active(running)	服务持续运行
    active(exited)	服务成功完成一次的配置
    active(waiting)	服务已经运行但在等待某个事件
    inactive		服务没有在运行
    enabled			服务设定为开机运行
    disabled		服务设定为开机不运行
    static			服务开机不启动,但可以被其他服务调用启动
    

    常用的命令

    systemctl命令(7系统)				作用
    systemctl enable crond.service		开机自动启动
    systemctl disable crond.service		开机不自动启动
    systemctl list-unit-files			查看各个级别下服务的启动与禁用
    systemctl is-enabled crond.service	查看特定服务是否为开机自启动
    systemctl daemon-reload				创建新服务文件需要重载变更
    
    展开全文
  • ESP8266--系统任务

    千次阅读 2019-01-15 09:53:47
    系统任务 1.系统任务原理 以下资料来自《ESP8266 Non-OS SDK API参考》第2.2章节与第3.3章节。 Non-OS SDK 不像基于 RTOS 的应⽤程序⽀持任务调度。 Non-OS SDK 使⽤四种类型的函数: 应用函数 回调函数 用户任务 ...

    系统任务

    1.系统任务原理

    以下资料来自《ESP8266 Non-OS SDK API参考》第2.2章节与第3.3章节。
    Non-OS SDK 不像基于 RTOS 的应⽤程序⽀持任务调度。 Non-OS SDK 使⽤四种类型的函数:

    • 应用函数
    • 回调函数
    • 用户任务
    • 中断服务函数

    1.1 应用函数

    应用函数类似于嵌入式C编程中常用的C函数。这些函数必须由另一个函数调用。应用函数在定义时建议添加ICACHE_FLASH_ATTR宏,相应程序将存放在flash中,被调用时才会加载到cache运行。而如果添加了IRAM_ATTR宏的函数,则会在上电启动时加载到iRAM中。

    1.2 回调函数

    回调函数是指不直接从用户程序调用的函数。而是当某系统事件发送时,相应的回调函数由non-OS SDK内核调用执行。这使得开发者能够在不使用RTOS或者轮询事件的情况下响应实时事件。
    要编写回调函数,用户首先需要使用相应的register_cb API注册回调函数。回调函数的示例代码包括定时器回调函数和网络事件回调函数。

    1.3 中断服务函数

    中断服务函数(ISR)是一种特殊类型的回调函数。发生硬件中断时会调用这些函数。当时能中断时,必须注册相应的中断处理函数。请注意,ISR必须添加IRAM_ATTR。

    1.4 用户任务

    用户任务可以分为三个优先级:0、1、2.任务优先级为2 > 1 > 0。即Non-OS SDK最多只支持3个用户任务,优先级分别为0、1、2。
    用户任务一般用于函数不能被调用的情况下。要创建用户任务,请参阅本文档中的system_os_task()的API描述。例如espconn_disconnect() API不能直接在espconn的回调函数中调用,因此建议开发者在espconn回调中创建用户任务来执行espconn_disconnect()。

    2. 硬件中断定时器相关API函数

    系统接⼝位于 /ESP8266_NONOS_SDK/include/user_interface.h。
    os_XXX 系列接⼝位于 /ESP8266_NONOS_SDK/include/osapi.h。

    2.1 system_os_task ()函数

    函数原型:bool system_os_task(os_task_t task,uint8 prio,os_event_t *queue,uint8 qlen)
    函数功能:创建系统任务,最多支持创建3个任务,优先级分别为0/1/2
    函数形参:
              os_task_t task:函数任务
              uint8 prio:任务优先级,可分为0/1/2;0为最低优先级。这表示最多只支持建立3个任务。
                可填形参: 
    enum {
                        USER_TASK_PRIO_0 = 0,
                        USER_TASK_PRIO_1,
                        USER_TASK_PRIO_2,
                        USER_TASK_PRIO_MAX
    };
              os_event_t *queue:消息队列指针
              uint8 qlen:消息队列深度
    返回值:
            ture :成功
            false:失败
    ==============================================================
    官方参考示例代码:
    #define	SIG_RX	 			0
    #define	TEST_QUEUE_LEN		4
    os_event_t	*testQueue;
    
    void test_task(os_event_t *e)
    {
    	switch (e->sig)
    	{
    		case	SIG_RX:
    			os_printf(sig_rx %c / n, (char)e->par);
    			break;
    		default:
    			break;
    	}
    }
    
    void task_init(void)
    {
    	testQueue = (os_event_t*)os_malloc(sizeof(os_event_t)*TEST_QUEUE_LEN);
    	system_os_task(test_task, USER_TASK_PRIO_0, testQueue, TEST_QUEUE_LEN);
    }
    
    

    2.2 system_os_post()函数

    函数原型:bool system_os_post(uint8 prio,os_signal_t sig,os_param_t par)
    函数功能:向任务发送消息
    函数形参:
              uint8 prio:任务优先级,与建立时的任务优先级对应
              os_signal_t sig:消息类型
              os_param_t par:消息参数
    返回值:
              ture :成功
              false:失败
    

    3. 参考代码

    3.1 系统任务调用顺序

    ① 创建任务指针
    ② 分配任务指针空间
    ③ 创建任务函数
    ④ 创建任务
    ⑤ 给系统安排任务
    ⑥ 编写任务函数(根据消息类型/消息参数实现相应功能)

    3.2 参考驱动源码

    //user_main.c
    #include "ets_sys.h"
    #include "osapi.h"
    
    #include "user_interface.h"
    #include "driver/uart.h"
    #include "gpio.h"
    #include "eagle_soc.h"
    #include "driver/delay.h"
    #include "driver/led.h"
    #include "driver/key.h"
    #include "driver/HwTimer.h"
    #include "osapi.h"
    #include "mem.h"				// 内存申请等函数
    
    /*
    *	① 创建任务指针
    *	② 分配任务指针空间
    *	③ 创建任务
    *	④ 创建任务函数
    *	⑤ 给系统安排任务
    *	⑥ 编写任务函数(根据消息类型/消息参数实现相应功能)
    * */
    #define	TEST_QUEUE_LEN		4	//消息队列深度
    os_event_t	*testQueue;			//① 创建任务指针
    
    								//④ 创建任务  形参必须为s_event_t *类型
    void test_task(os_event_t * Task_message)
    {
    	//⑤ 给系统安排任务
    	os_printf("消息类型=%d,消息参数=%c\r\n", Task_message->sig, Task_message->par);
    }
    
    void ICACHE_FLASH_ATTR user_init(void)
    {
    	int i;
    	char data = 0;
    	char ch = 'a';
    	uart_init(115200, 115200);//设置串口波特率
    	DelayMs(1000);			// 延时1秒
    	//	LedInitConfig();//LED灯初始化函数
    	//	KeyInitConfig();//按键初始化函数
    	//	KeyExtiInitConfig();//配置按键外部中断
    	//	TimerInitConfig(500,1);
    	//	hw_timer_set_func();
    	//	HwTimerInitConfig();
    	os_printf("=============================================\r\n");
    	os_printf("\t SDK version:\t%s", system_get_sdk_version());
    	os_printf("\r\n嵌入式陈工个人编辑资料\r\n未经本人同意请勿私自传播\r\n");
    	os_printf("\r\n系统任务调度代码\r\n");
    	os_printf("\r\n带看门狗\r\n");
    	os_printf("=============================================\r\n");
    
    	//② 分配任务指针空间
    	testQueue = (os_event_t*)os_malloc(sizeof(os_event_t)*TEST_QUEUE_LEN);
    	//③ 创建任务函数
    	system_os_task(test_task, USER_TASK_PRIO_0, testQueue, TEST_QUEUE_LEN);
    	for (i = 0; i < 5; i++)
    	{
    		system_soft_wdt_feed();//喂软件看门狗,防止程序跑偏
    
    		os_DelayMs(1000);			// 延时1秒  系统延时函数
    		os_printf("安排任务:Task = %d\r\n", i);
    
    		// 调用任务(参数1=任务等级 / 参数2=消息类型 / 参数3=消息参数)
    		// 注意:参数3必须为无符号整数,否则需要强制类型转换
    		//---------------------------------------------------------------
    		system_os_post(USER_TASK_PRIO_0, data ++, ch ++);
    	}
    	os_printf("任务创建完成\r\n");
    }
    

    源代码参考:https://github.com/ChenJiliang00/ESP8266

    展开全文
  • 任务系统

    千次阅读 2018-06-02 22:18:20
    任务系统1 任务系统设计思路 (1) 玩家对任务的操作有:接受、提交、放弃任务。他们的逻辑入口函数都是UBI_CAIHuman类成员函数,主要处理逻辑都放在了UBI_CAIQuest类的成员函数里。(a) 接受任务:UBI_CAIHuman::...

    任务系统

    1 任务系统设计思路

    (1) 玩家对任务的操作有:接受、提交、放弃任务。他们的逻辑入口函数都是UBI_CAIHuman类成员函数,主要处理逻辑都放在了UBI_CAIQuest类的成员函数里。

    (a) 接受任务:UBI_CAIHuman::DoAcceptQuest()->UBI_CAIQuest::DoAccept()

    (b) 提交任务:UBI_CAIHuman::DoCompleteQuest()->UBI_CAIQuest::DoComplete()

    (c) 放弃任务:UBI_CAIHuman::DoAbandonQuest()->UBI_CAIQuest::DoAbandon()

     

    (2) 按照任务内容,来更新任务状态。

    (a) 杀怪:UBI_CAIHuman::OnQuestKillObject()->UBI_CAIQuest::DoQuestKillObject()

    (b) 采集:UBI_CAIHuman::OnQuestGather()->UBI_CAIQuest::DoQuestGather()

    (c) 进入区域:UBI_CAIHuman::OnQuestEnterArea()->UBI_CAIQuest::DoQuestEnterArea()

    (d) 使用物品:UBI_CAIHuman::OnQuestUseItem()->UBI_CAIQuest::DoQuestUseItem()

    (e) 点击面板:UBI_CAIHuman::OnQuestClickPanel()->UBI_CAIQuest::DoQuestClickPanel()

    (f) 物品改变:UBI_CAIHuman::OnQuestItemCountChange()->UBI_CAIQuest::DoQuestItem _CountChange()

    2任务系统关注点

    (1) 任务的实现方式有两种,脚本和表格类。

    因此在任务的每个逻辑流程中都实现了脚本和表格分支,它们是通过任务基本表里的任务绑定脚本ID来区分的,若ID大于0则走脚本流程,否则走表格流程。具体如下:

    (a) 点击NPC显示任务选项:在Lua_DispatchEventList函数里对任务是否显示的判断做了脚本和表格的分支。

    (b) 接受任务:在接受任务的入口函数UBI_CAIHuman::DoAcceptQuest()里做了脚本和表格的分支。

    (c) 提交任务:在提交任务的入口函数UBI_CAIHuman::DoCompleteQuest()里做了脚本和表格的分支。

    (d) 放弃任务:在放弃任务的入口函数UBI_CAIHuman::DoAbandonQuest()里做了脚本和表格的分支。

    (e) 杀怪:在函数UBI_CAIHuman::OnQuestKillObject()里做了脚本和表格的分支。只要是人为杀死的怪都会走任务逻辑。表格:先遍历玩家身上的任务,再在任务基本表中找到他的杀怪触发点。脚本:调用该玩家所有已接任务脚本里的OnKillObject()接口。如果多个任务杀的是同种怪,则杀死一个这类怪就会更新所有这些相关任务参数。

    (f) 采集:在函数UBI_CAIHuman::OnQuestGather()里做了脚本和表格的分支。每次采集生长点都会走任务流程。表格:先遍历玩家身上的任务,再在任务基本表中找到他的采集触发点。脚本:调用该玩家所有已接任务脚本里的OnGather ()接口。

    (g) 进入区域:在函数UBI_CObjectHuman::OnEnterArea()里做了脚本和表格的分支。脚本:玩家进入绑定了脚本的区域里的时候,程序会调用到脚本函数OnEnterArea(),在里面判断该玩家是否接了该区域相关任务,如果是则调用相应的任务脚本函数。表格:玩家进入任何区域都会走进区域任务函数UBI_CAIHuman::OnQuestEnterArea(),在这里先遍历玩家身上的任务,再在任务基本表中找到他的区域触发点。

    (h) 使用物品:在CSUseQuestItemHandler()函数里做了脚本和表格的分支。物品是否能使用的判断逻辑和物品的使用逻辑做了分离,这两个逻辑均做了脚本和表格的分支。

    (i) 点击面板:有两种面板,一个是与NPC关联的,一个是非关联的,它们分别在CSAskNpcEventInfoHandler()函数和CSAskTriggerPanelInfoHandler()函数里做了脚本和表格的分支。表格:通过配表可实现对话以及其他一些功能,比如生成NPC,特效等。脚本:可实现对话,另外可灵活添加其它功能。复杂的对话任务最好用脚本去实现。

    (j) 物品改变:在UBI_CAIHuman::OnQuestItemCountChange()函数里做了脚本和表格的分支。表格:先遍历玩家身上的任务,再在任务基本表中找到他的物品改变触发点。脚本:调用该玩家所有已接任务脚本里的OnItemChanged ()接口。

     

    (2) 脚本触发点和效率优化。

    (a) NPC对话框里是否显示任务:OnEnumerate(),比如判断前序任务是否做完,判断玩家等级是否达到接受任务的要求等。

    (b) 接受任务:OnAccept(),将任务挂靠在玩家身上写死在了C++代码里,脚本只需关注接受任务后的一些特殊需求,比如切相位,给物品等。

    (c) 放弃任务:OnAbandon(),删除玩家身上的任务也写死在了C++代码里,脚本只需关注放弃任务后的一些特殊需求,比如删物品,删buff等。

    (d) 提交任务:OnSubmit()。给玩家的普通奖励写死在了C++代码里,脚本只需关注提交任务后的特殊需求,比如给buff,给技能等。

    (e) 杀怪:OnKillObject(),怪物被玩家杀死之后只要玩家身上有已接的脚本类任务,就会走到这些任务的这个接口里,当然只要这些任务的目标不是杀这个怪,那么只是走进去而已,不会有别的逻辑。效率上是否能再优化呢?

    (f) 采集:OnGather(),玩家采集完生长点之后只要玩家身上有已接的脚本类任务,就会走到这些任务的这个接口里。同上,只要这些任务的目标不是采集这个生长点,那么也只是走进去而已,不会有别的逻辑。采集事件不多,个人感觉效率上没有必要再去优化。如果需要优化的话,可以通过将生长点绑定脚本,然后调用该脚本来实现。

    (g) 进入区域:Area:OnEnterArea()->Quest:OnEnterArea(),玩家进入绑定了脚本的区域后,调用该区域脚本里的Area:OnEnterArea()接口,在该接口里再调用所有与该区域相关的脚本类任务的Quest:OnEnterArea()接口。这个效率应该还行,没什么可优化的。

    (h) 使用物品:CanUseQuestItem()OnQuestUseItem(),玩家在使用任务物品时先通过CanUseQuestItem()接口来判断是否能使用,比如使用位置,场景是否匹配等,然后再通过OnQuestUseItem()接口来做一些使用完物品的逻辑。目前实现有问题,需要修改。需要将任务物品绑定脚本来实现。

    (i) 点击面板:即对话任务,OnDialog()OnDialogRequest(),目前能满足策划的对话任务的所有需求,效率上没什么可优化的了。

    (j) 物品改变:OnItemChanged()背包里添加和删除物品都会走到这,影响服务器效率。优化的方式就是通过绑定物品与脚本的方式来做。

    (k) 上线:OnOnLine(),主要针对计时类或者一些特殊任务的上线处理。每个脚本任务都会有这个接口,所以玩家每次上线只要身上挂了任务,就会走到这里,不过一般没什么处理逻辑。

    (l) 下线:OnOffLine(),同上。

    (m) 其它:策划有时候会有一些特殊任务需求,比如切相位触发任务完成,穿装备触发任务完成等,我们目前的做法都是尽量让它只触发到某个特定脚本,而不是去走一遍玩家身上挂靠的所有任务的相关接口,以节省服务器执行时间。

    (3) 网络包流量。

    任务对白,任务奖励数据客户端和服务器都存了一份,因此服务端发任务相关包的时候无需加上这些数据,节省了包流量。客户端所存的任务数据只做显示用,不做逻辑处理,所有任务逻辑都在服务端做。

    3天龙任务系统流程

    (1) NPC身上的任务的挂接

    表格任务,需要先把任务挂接到NPC身上;脚本任务,一般不需要事先挂接好,任务脚本号(即事件ID列表)会写在NPC的Obj脚本中,执行函数时,会轮询那些事件ID列表中的脚本号,执行NPC的Event脚本。

    (2) 客户端点击NPC弹出对话面板

    à Client: 点击Npc时候,发CGCharDefaultEvent包。

    CGCharDefaultEvent msg;

    msg.setObjID(idTargetObj);

    CNetManager::GetMe()->SendPacket(&msg );

    à Server: 根据Npc的ObjID号,PushCommand。

    pHuman->GetHumanAI()->PushCommand_DefaultEvent(idTarget),此函数里面做了:

    pCharacter->getScene()->GetLuaInterface()->ExeScript_DDD(

                  idScript,

                  DEF_EVENT_ENTRY_FUNC_NAME, //脚本进入函数 "OnDefaultEvent"

                  (INT)pCharacter->getScene()->SceneID(),

                  (INT)pCharacter->GetID(),

                  (INT)pNPC->GetID()) ;

    NPC的Obj脚本函数OnDefaultEvent里面一般是:

    BeginEvent(sceneId)

    local PlayerName=GetName(sceneId,selfId)

    AddText(sceneId,"你们宋人都是我的俘虏,都要听我的")

    for i, eventId in x022008_g_eventList do ---遍历事件列表中的Event脚本号

    CallScriptFunction(eventId, "OnEnumerate",sceneId,selfId, targetId)

    End

    EndEvent(sceneId)

    DispatchEventList(sceneId,selfId,targetId)

    Npc的Event脚本中的OnEnumerate函数里,也是类似一些AddNumText、AddText函数,他们被BeginEvent…EndEvent…DispatchEventList包了起来,其作用是:

    BeginEvent是把一块任务缓冲MisBuf清空,为传输做好准备;

    typedef struct_MisBuf

    {

        enum

        {

               MISSIONBUFLEN= 64,

               MISSIONCHARBUFLEN= MISSIONBUFLEN * 4 * 8,//因为客户端的bug,所以放大buf长度

        };

        typedefstruct _MisItemBuf

        {

               //这个buf存储了发送给客户端的字符信息串,客户端需要注意字符解析问题

               CHARbuf[MISSIONCHARBUFLEN];

               enumBufType

               {

                      BufType_Int,

                      BufType_Str,

                      BufType_IntStr,

                      BufType_Money,

                      BufType_Item,

                      BufType_RandItem,

                      BufType_RadioItem,

                      BufType_Skill

               }mType

               INTm_BufUse;

               VOIDSetBufUse(INTNewBufUse){

                      m_BufUse += NewBufUse;

               }

               INTGetBufUse(void){

                      return m_BufUse;

               }

               INTGetBufMaxSize(){

                      return MISSIONCHARBUFLEN;

               }

               INTAddBuf(VOID*vpNewBuf, INTnNewBufLen){

                      if (m_BufUse+nNewBufLen > MISSIONCHARBUFLEN)

                      {

                             return 0;

                      }

                      memcpy(buf+m_BufUse, (VOID*)(vpNewBuf), nNewBufLen);

                      m_BufUse += nNewBufLen;

                      return m_BufUse;

               }

        }MisItemBuf[MISSIONBUFLEN];

        MisItemBufBuff;

        INTmUseNum;

    }MisBuf;

    而DispatchEventList则是解析这块MisBuf,根据每个缓冲块的类型(缓冲块内容是在AddText,AddNumText时加进去的),填充到一个ScriptParam_EventList包中:

    ScriptParam_EventList paramEventList;

           paramEventList.Reset();

    paramEventList.m_idNPC = targetId;

    paramEventList.AddItem(&itemEvent ); //填充

    之后发给客户端

           Packets::GCScriptCommand Msg;

           Msg.SetEventListResponseCmd( &paramEventList );

           Player* pPlayer = pHuman->GetPlayer();

           pPlayer->SendPacket( &Msg ) ;

    该包定义如下:

    struct ScriptParam_EventList

    {

           ObjID_t                       m_idNPC;

           BYTE                          m_yItemCount;

           ScriptEventItem            m_seiItem[MAX_EVENT_LIST_ITEM_COUNT];

           VOID AddItem( const ScriptEventItem*pItem ){

                  if ( m_yItemCount< MAX_EVENT_LIST_ITEM_COUNT )

                  {

                         m_seiItem[m_yItemCount]= *pItem;

                         m_yItemCount++;

                  }

           }

    };

    VOID SetEventListResponseCmd(const ScriptParam_EventList*pEventList ){

                         m_nCmdID =SCRIPT_COMMAND_EVENT_LIST_RESPONSE;

                         m_paramEnentList =*pEventList;

                  }

    à Client: 解析Server发过来的这块MisBuf,生成NPC对话框。

    GCScriptCommandHandler中:

    CUIDataPool*pDataPool = (CUIDataPool*)(CGameProcedure::s_pDataPool);

    SCommand_DPCcmdTemp;

    cmdTemp.m_wID= DPC_SCRIPT_COMMAND;

    cmdTemp.m_anParam[0]= pPacket->getCmdID();

    cmdTemp.m_apParam[1]= pPacket->getBuf();

    pDataPool->OnCommand_(&cmdTemp );

    // DPC_SCRIPT_COMMAND是脚本指令

    // D0       :      script command id

    // P1           :      param list

    // #define   DPC_SCRIPT_COMMAND    (6)

    上面的OnCommand_ ( const SCommand_DPC*pCmd )中主要做了:

    switch ( pCmd->m_wID)

    {

           case DPC_SCRIPT_COMMAND: //客户端自己填充的

                  {

                         INT nCmdID  = pCmd->m_anParam[0]; //服务器设置过来的

                         VOID *pBuf   = pCmd->m_apParam[1];

                         switch ( nCmdID )

                         {

                         case SCRIPT_COMMAND_EVENT_LIST_RESPONSE: // 事件列表返回

                                *m_pEventList = *((ScriptParam_EventList*)(pBuf));

                                OnEventListResponse();

                                break;

                         case SCRIPT_COMMAND_MISSION_RESPONSE// 打开任务信息

                                *m_pMissionInfo = *((ScriptParam_MissionInfo*)(pBuf));

                                OnMissionInfoResponse();

                                break;

                                //任务需求信息(完成任务的文字描述,完成需要的物品,奖励的物品)

                         case SCRIPT_COMMAND_MISSION_DEMAND_RESPONSE:// 任务需求的查询返回

                                *m_pMissionDemandInfo = *((ScriptParam_MissionDemandInfo*)(pBuf));

                                OnMissionDemandInfoResponse();

                                break;

                                //任务继续信息(包含了奖励信息,在点击continue之后再去显示)

                         case SCRIPT_COMMAND_MISSION_CONTINUE_RESPONSE:// 任务的继续按钮事件返回

                                *m_pMissionContinueInfo = *((ScriptParam_MissionContinueInfo*)(pBuf));

                                OnMissionContinueInfoResponse();

                                break;

                                //任务完成情况提示信息

                         case SCRIPT_COMMAND_MISSION_TIPS:// 任务提示

                                *m_pMissionTips = *((ScriptParam_MissionTips*)(pBuf));

                                OnMissionTips();

                                break;

                                //技能学习信息

                         case SCRIPT_COMMAND_SKILL_STUDY:// 技能信息

                                m_pSkillStudy->Reset();

                                *m_pSkillStudy = *((ScriptParam_SkillStudy*)(pBuf));

                                OnSkillStudy();

                                break;

                         default:

                                break;

                         }

                  }

                  break;

           case DPC_UPDATE_MISSION_LIST://名字似乎不再合适了

                  {

                         UINT dwObjID = pCmd->m_adwParam[0];

                         UINT dwModifyFlags= pCmd->m_adwParam[1];

                         _OWN_MISSION *paMissionBuf = (_OWN_MISSION*)(pCmd->m_apParam[2]);

                         UINT i;

                         CDetailAttrib_Player* playData= const_cast<CDetailAttrib_Player*>(CUIDataPool::GetMe()->GetMySelfDetailAttrib());

                         _OWN_MISSION *pMission;

                         for ( i = 0; i < MAX_CHAR_MISSION_NUM;i++ )

                         {

                                if ( dwModifyFlags& (0x00000001 << i) )

                                {

                                       pMission = &(playData->m_listMission.m_aMission[i]);

                                       memcpy( (void*)pMission, &paMissionBuf[i], sizeof(_OWN_MISSION) );

                                       CGAskMissionDesc msg;

                                       msg.setMissionIndex(pMission->m_idMission);

                                       CNetManager::GetMe()->SendPacket( &msg);

                                }

                         }

                  }

                  break;

           case DPC_UPDATE_MISSION_ADD:

                  {

                         _OWN_MISSION *pMission       = (_OWN_MISSION*)(pCmd->m_apParam[0]);

                         m_pPlayerData->AddMission(pMission );

                         CGAskMissionDesc msg;

                         msg.setMissionIndex(pMission->m_idMission);

                         CNetManager::GetMe()->SendPacket( &msg);

                         rcResult = RC_OK;

                  }

                  break;

           case DPC_UPDATE_MISSION_REMOVE:

                  {

                         MissionID_t idMission= (MissionID_t)(pCmd->m_adwParam[0]);

                         m_pPlayerData->RemoveMission(idMission );

                         rcResult = RC_OK;

                  }

                  break;

    这时候就会执行OnEventListResponse,里面会调用:

    CEventSystem::GetMe()->PushEvent(GE_QUEST_EVENTLIST, pNPC? pNPC->GetID() : -1);

    客户端会执行相应的脚本:

    --=========================================================

    -- 事件处理

    --=========================================================

    functionQuest_OnEvent(event)

           local objCared = tonumber(arg0);

           --第一次和npc对话,得到npc所能激活的操作

           if(event == "QUEST_EVENTLIST") then

                  --关心NPC

                  BeginCareObject_Quest(objCared)

                  this:Show();

                  QuestGreeting_Desc:ClearAllElement();

                  Quest_EventListUpdate();

     

           --在接任务时,看到的任务信息

           elseif(event == "QUEST_INFO")then

                  --关心NPC

                  BeginCareObject_Quest(objCared)

                  this:Show();

                  QuestGreeting_Desc:ClearAllElement();

                  Quest_QuestInfoUpdate()

     

           --接受任务后,再次和npc对话,所得到的任务需求信息,(任务完成)

           elseif(event =="QUEST_CONTINUE_DONE") then

                  QuestGreeting_Desc:ClearAllElement();

                  Quest_MissionContinueUpdate(1);

     

           --接受任务后,再次和npc对话,所得到的任务需求信息,(任务未完成)

           elseif(event =="QUEST_CONTINUE_NOTDONE") then

                  QuestGreeting_Desc:ClearAllElement();

                  Quest_MissionContinueUpdate(0);

                  --关心NPC

                  BeginCareObject_Quest(objCared)

     

           --点击“继续之后”,奖品选择界面

           elseif(event =="QUEST_AFTER_CONTINUE") then

                  --关心NPC

                  this:Show();

                  QuestGreeting_Desc:ClearAllElement();

                  Quest_MissionRewardUpdate();

    end

    这里的Quest_EventListUpdate负责显示任务列表:

    for i=1,nEventListNum do

           local strType,strState,strScriptId,strExtra,strTemp= DataPool:GetNPCEventList_Item(i-1);

           if(strType == "text") then

                  QuestGreeting_Desc:AddTextElement(strTemp);

           elseif(strType == "id") then

                  strTemp = strTemp .. "#"

                  strTemp = strTemp .. strScriptId

                  strTemp = strTemp .. ","

                  strTemp = strTemp .. strExtra

                  strTemp = strTemp .. "$"

                  strTemp = strTemp .. strState

                  if(tonumber(strState) == 1 ortonumber(strState) == -1) then

                         canacceptArr[k] = strTemp;

                         k = k+1;

                  elseif(tonumber(strState) == 2)then

                         cansubmitArr[j] = strTemp;

                         j = j+1;

                  else

                         QuestGreeting_Desc:AddOptionElement(strTemp);

                  end

           end

    end

    上面就是根据具体类型(是普通文本还是按钮(按钮上绑定脚本号))添加到NPC对话面板中去。ComplexWindow::AddOptionElement(strTmep)对strTmep按照"#"、","、"$"解析完毕后,内部又调用了:

    void FalagardComplexWindow::AddChildElement_Option(String strText,StringstrExtra1,String strExtra2, String strText3, FontBase* font)

    {

          ChildElement_Option* pNewChild = new ChildElement_Option;//动态创建窗口

           pNewChild->d_Type= CT_Option;

           pNewChild->d_Text= strText;

           if(font) pNewChild->d_Font= font;

           else pNewChild->d_Font = getFont();

     

           char szTempName[32];

           int nIndex = 0;

           for(int i=0; i<(int)d_ChildVector.size(); i++)

           {

                  if(d_ChildVector[i]->d_Name.substr(0, 10) == (utf8*)"__option__")

                  {

                         nIndex++;

                  }

           }

    _snprintf(szTempName, 32, "__option__%02d#%d,%d", nIndex,atoi(strExtra1.c_str()),atoi(strExtra2.c_str()));

           pNewChild->d_Name= (utf8*)szTempName; //作为窗口名字

           pNewChild->d_State= atoi(strText3.c_str());

           switch( pNewChild->d_State)

           {

                  case 1:

                         pNewChild->d_Button= static_cast<FalagardButton*>(WindowManager::getSingleton().createWindow((utf8*)"TLBB_QuestButton_1", getName() + szTempName));//

                         break;

                  case 2:

                         pNewChild->d_Button= static_cast<FalagardButton*>(WindowManager::getSingleton().createWindow((utf8*)"TLBB_QuestButton_2", getName() + szTempName));//

                         break;

                  default:

                         pNewChild->d_Button= static_cast<FalagardButton*>(WindowManager::getSingleton().createWindow((utf8*)"TLBB_QuestButton_1", getName() + szTempName));//

                         break;

                  }

           pNewChild->d_Button->setText(" "+strText);

           pNewChild->d_Button->show();

    pNewChild->d_Button->subscribeEvent(PushButton::EventClicked, //注册事件响应函数Event::Subscriber(&FalagardComplexWindow::handleOptionClicked, this));

           //设为子窗口

           d_ParentWindow->addChildWindow(pNewChild->d_Button);

           d_ChildVector.push_back(pNewChild);

    performWindowLayout();

    }

    所以点击对话框面板上的按钮时,就会调用:

    bool FalagardComplexWindow::handleOptionClicked(constEventArgs& e)

    {

           WindowEventArgs arg( ((constWindowEventArgs&) e).window);

           fireEvent(EventOptionClicked, arg,EventNamespace);

           return true;

    }

    /*************************************************************************

           Fire / Trigger anevent

    *************************************************************************/

    voidEventSet::fireEvent(const String& name, EventArgs& args, constString& eventNamespace)

    {

        // handle globalevents

       GlobalEventSet::getSingleton().fireEvent(name, args, eventNamespace);

        // handle localevent

        fireEvent_impl(name, args);

    }

    voidEventSet::fireEvent_impl(const String& name, EventArgs& args)

    {

        // find eventobject

        Event* ev = getEventObject(name);

        // fire the event if present and set is notmuted

        if ((ev != 0) && !d_muted)

            (*ev)(args);

    }

    除了AddChildElement_Option,还有AddChildElement_ItemAddChildElement_ActionAddChildElement_HyperLinkAddChildElement_Money等函数。

    (3) 客户端点击按钮选项

    à Client:客户端点击对话面板中按钮,就会执行:

    FalagardComplexWindow::handleOptionClicked,最终执行(*ev)(args),见上面分析。

    即:boolScriptFunctor::operator()(const EventArgs& e) const

    {

           ScriptModule* scriptModule = System::getSingleton().getScriptingModule();

           if (scriptModule)

           {

                  return scriptModule->executeScriptedEventHandler(scriptFunctionName,e);

           }

    }

    天龙里已经对虚的加以下面实现:

    bool CGameUIScript::executeScriptedEventHandler(const String&strHandle, const EventArgs& e)

    {

           const WindowEventArgs& eWindow =(const WindowEventArgs&)e;

           Window* pWindow = eWindow.window;

           g_theUIEventArg.m_pEventArg = &e;

           do

           {

                  if(!pWindow) break;

                  void* pUserData =pWindow->getUserData();

                  if(pUserData)

                  {

                         ((CUIWindowItem*)pUserData)->FireUIEvent(strHandle.c_str(), eWindow.window);

                         break;

                  }

                  …

    }

    VOID CUIWindowItem::FireUIEvent(LPCTSTR szEventHandle, CEGUI::Window*pWindow)

    {

           //设置当前全局参数arg0为当前选择的窗口名字

           g_pScriptSys->GetLuaState()->GetGlobals().SetString("arg0",pWindow->getName().c_str());

           //即:执行脚本函数:QuestOption_Clicked

    m_pScriptEnv->DoString(szEventHandle);

    }

    那么上面的scriptFunctionName是什么时候被赋值成QuestOption_Clicked的呢?

    是在解析XML文件时候被赋值的:

    // handle event subscription element

    else if(element == EventElement)

    {

    String eventName(attributes.getValueAsString(EventNameAttribute));

        String functionName(attributes.getValueAsString(EventFunctionAttribute));

           // attempt tosubscribe property on window

           try

           {

                  if (!d_stack.empty())

                  {

               d_stack.back()->subscribeEvent(eventName,ScriptFunctor(functionName));

                  }

           }

    … …

    }

    上面的FalagardComplexWindow类型控件:QuestGreeting_Desc已经注册了Click事件的响应函数QuestOption_Clicked,这样上面的functionName就是QuestOption_Clicked啦。

    --=========================================================

    -- 选择一个任务

    --=========================================================

    function QuestOption_Clicked()

           -- arg0的格式是

           -- QuestGreeting_option_03#211207,0

           pos1,pos2 =string.find(arg0,"#");

           pos3,pos4 =string.find(arg0,",");

           local strOptionID = -1;

           local strOptionExtra1 = string.sub(arg0,pos2+1,pos3-1 );

           local strOptionExtra2 = string.sub(arg0,pos4+1);

    QuestFrameOptionClicked(tonumber(strOptionID),tonumber(strOptionExtra1),tonumber(strOptionExtra2));

    end

    QuestFrameOptionClicked函数里面会调用SendSelectEvent(nIndex,nExIndex1,nExIndex2); SendSelectEvent会根据其参数去客户端的事件列表中查询,返回对应的事件,然后发包:

    CGEventRequestmsg;

    msg.setExIndex( pItem->m_index);

    msg.setScriptID(pItem->m_idScript );

    msg.setNPCID(m_pEventList->m_idNPC );

    CNetManager::GetMe()->SendPacket(&msg );

    à Server:根据NpcID,脚本号,还有按钮索引,PushCommand。

    ObjID_t idObj = pHuman->GetID() ;

           ObjID_t idNPC = pPacket->getNPCID(); // NPC ID

           ScriptID_t idScript =pPacket->getScriptID(); //脚本号

           INT exIndex = pPacket->getExIndex(); //按钮索引

           pHuman->GetHumanAI()->PushCommand_EventRequest(idNPC, idScript,exIndex),此函数中主要调用了:

           pCharacter->getScene()->GetLuaInterface()->OnEventRequest(

                  idScript, pCharacter->GetID(), pNPC->GetID(),idEvent, exIndex ) ;

    其中就会调用到脚本函数,例如:

    --**********************************

    --事件列表选中一项(NPCObj脚本)

    --**********************************

    functionx002045_OnEventRequest(sceneId, selfId, targetId, eventId )

           if GetNumText()==0   then

                  ifIsHaveMission(sceneId,selfId,4021) > 0 then

                         BeginEvent(sceneId)

                         AddText(sceneId,"你有漕运货舱在身,我们驿站不能为你提供传送服务。");

                         EndEvent(sceneId)

                         DispatchEventList(sceneId,selfId,targetId)

                  else 

                         CallScriptFunction((400900),"TransferFunc",sceneId, selfId, 17,94,149)

                  end

           else

                  for i, findId inx002045_g_eventList do ---遍历NPCEvent脚本

                         if eventId == findId then

                                CallScriptFunction(eventId, "OnDefaultEvent",sceneId, selfId, targetId )

                                return

                         end

                  end

           end

    end

    (4) 点击“接受任务”按钮

    à Client:Lua_QuestFrameAcceptClicked

    VOIDCUIDataPool::SendAcceptEvent()

    {

           CGMissionAccept msg;

           msg.setScriptID(m_pMissionInfo->m_idScript );

           msg.setNPCID( m_pMissionInfo->m_idNPC);

           CNetManager::GetMe()->SendPacket(&msg );

    }

    4永生任务系统流程

    (1) 客户端点击NPC

    à Client:

      UBI_CCSDefaultDialogPacket

    à Server:

      CSDefaultDialogHandler -> 调用脚本

       --sceneId表示场景号,selfid玩家,targetIdNPC

    function x000001_OnDefaultEvent(sceneId, selfHighId, selfLowId, targeHighId, targeLowId )

           BeginAddEvent(sceneId)

            AddEvent(sceneId, -1, 2, string4)

            AddEvent(sceneId, -1, 13, string5)

           EndAddEvent(sceneId)

           DispatchEventList( sceneId, selfHighId,selfLowId, targeHighId, targeLowId )

           return 1

      end

      其中DispatchEventList中又会发包:SCNPCEventListPacket

    à Client:

      SCNPCEventListExecute,

     pNPCDialogData->SetEventList(pSCNPCEventListPacket->GetNPCEvent(i),i);

     pEventSystem->PushEvent(GAME_EVENT_SHOW_NPCDIALOG, vParam);

    (2) 客户端点击按钮选项

    客户端点击按钮后执行:UBI_CNPCDialogData::ClickEventButton。

    (a) 打孔镶嵌等

    à Client:

      CSAskNpcEvent

    à Server:

      SCNpcEventInfo

    à Client:

      SCNpcEventInfoExecute

     

    (b) 接受任务等

    à Client:

      CSAskNpcEvent

    à Server:

      NPCQuestData

    à Client:

      NPCQuestDataExecute

     pEventSystem->PushEvent(GAME_EVENT_SHOW_QUEST, vParam);

     

     

     

    展开全文
  • 实时操作系统任务调度

    千次阅读 2014-11-18 18:55:00
    最近看了一些实时操作系统的源码,关于任务调度是实时操作系统的重要组成部分,但是何时发生调度,怎样才能发生调度却不是非常的清晰,书中一本而言所说的都是“如果有更高优先级任务就绪,就会发生调度”,这会让很...
  • 一、简介 crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows... crond进程定期(每分钟)检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。用户在cron表 (也被称...
  • ssis文件系统任务

    千次阅读 2011-04-21 09:58:00
        文件系统任务对文件系统中的文件和目录执行操作。例如,通过使用文件系统任务,包可以创建、移动或删除目录和文件。您还可以使用文件系统任务设置文件和目录的属性。例如,文件系统任务可以让...
  • 浅谈实时操作系统任务调度

    千次阅读 2014-11-15 14:39:27
    一、1、 调度用来确定多任务环境下任务执行的顺序和在获得CPU资源后能够执行的时间长度。  2、 操作系统通过一个调度程序来实现调度功能。  调度程序以函数的形式存在,用来实现操作系统的调度算法。调度...
  • 操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 = 50且  例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -
  • 浅谈实时操作系统任务管理 和 调度

    千次阅读 2011-12-13 09:05:22
    浅谈实时操作系统任务管理   一、任务管理机制 1、 任务管理用来实现对任务状态的直接控制和访问。 2、内核的任务管理是通过系统调用来体现,主要包括任务创建、任务删除、任务挂起、任务唤醒、设置...
  • VxWorks的系统任务

    千次阅读 2012-07-09 15:30:18
    这里只总结几个VxWorks启动后系统自带的任务  (即:目标板加电启动成功后,系统便已经开始运行的任务)  1.tUsrRoot (根任务) --优先级0  VxWorks内核最先执行的一个任务,其入口点为文件config/all/...
  • Ucos操作系统任务优先级分配原则

    千次阅读 2019-08-12 12:24:16
    ucos是一个可剥夺性内核的操作系统。所以每一个任务都必须有一个优先级。ucos操作系统任务的优先级使用一个8位整型数据来表示的。比如我们的0,1,2,3这些数,UCOS任务优先级的取值范围为 0 - OS_LOWEST_PRIO之间...
  • 隐藏系统任务

    千次阅读 2009-05-12 14:40:00
    上面代码确能隐藏任务栏,但是,随便打开一个窗口最大化,原来任务栏的地方仍被空白占据着。调用Win32 API- SystemParametersInfo(SPI_SETWORKAREA),重新设置桌面工作区域,可解决这个问题,代码如下:void gShow
  • win10经过周年更新后,不少用户碰到任务栏卡死的现象,右击任务栏无任何反应,这多是由资源管理器运行异常、右键菜单设置不当等因素导致的,下面就和大家分享win10任务栏卡死的解决方法。  方法一、  按ctrl+...
  • ucosIII 系统任务占用的优先级

    千次阅读 2015-12-30 10:03:57
    系统任务占用的优先级优先级0中断服务管理任务 OS_IntQTask()优先级1时钟节拍任务 OS_TickTask()优先级2定时任务 OS_TmrTask()优先级OS_CFG_PRIO_MAX-2统计任务 OS_StatTask()优先级OS_CFG_PRIO_MAX-1空闲任务 OS_...
  • SSIS 中的文件系统任务 (File System Task) 经常被用来执行与 Windows 系统下文件操作相关的操作,比如建立目录、删除目录、删除目录下的文件和在目录之间移动文件等。文件系统任务编辑器中的 Operation 选项用来...
  • //窗体覆盖任务栏 this.TopMost = true; this.Location = new Point(0, 0); this.Size = new Size(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height); //窗体覆盖任务栏 this.FormBo
  • 解决方案:重启“Windows资源管理...Ctrl+Alt+Delete”打开“任务管理器,切换到“进程”选项卡,选中“Windows资源管理器”项,点击“重新启动”按钮。待”Windows资源管理器“重启完成后,再尝试右击任务栏。  ...
  • 华为机试—操作系统任务调度

    千次阅读 2014-12-27 15:38:29
    题目:操作系统任务调度问题 操作系统任务分为系统任务和用户任务两种。其中, 系统任务的优先级 = 50且 现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。   函数...
  • 通过win的“任务”功能来定时执行一个bat文件,bat文件会调用php.exe文件,php.exe可以传递参数指定执行哪个类和方法 方法如下: 一,thinkphp开启cli支持 1、tp正好支持cli命令模式,手册的路径为13.7.4 如果是...

空空如也

1 2 3 4 5 ... 20
收藏数 1,542,286
精华内容 616,914
关键字:

系统任务