精华内容
下载资源
问答
  • 这个是我在网上找的不知道是不是你要的:java定时...一、延时执行首先,我们定义一个类,给它取个名字叫timetask,我们的定时任务,就在这个类的main函数里执行。代码如下:packagetest;importjava.util.timer;pu...

    这个是我在网上找的不知道是不是你要的:

    java定时任务timer关于定时任务,似乎跟时间操作的联系并不是很大,但是前面既然提到了定时任务,索性在这里一起解决了。设置定时任务很简单,用timer类就搞定了。一、延时执行首先,我们定义一个类,给它取个名字叫timetask,我们的定时任务,就在这个类的main函数里执行。代码如下:

    packagetest;

    importjava.util.timer;

    publicclasstimetasktest{

    publicstaticvoidmain(string[]args){timertimer=newtimer();

    timer.schedule(newtask(),60*1000);

    }

    }

    解释一下上面的代码。上面的代码实现了这样一个功能,当timetask程序启动以后,过一分钟后执行某项任务。很简单吧:先new一个timer对象,然后调用它的schedule方法,这个方法有四个重载的方法,这里我们用其中一个,

    publicvoidschedule(timertasktask,longdelay)

    首先,第一个参数第一个参数就是我们要执行的任务。这是一个timertask对象,确切点说是一个实现timertask的类的对象,因为timertask是个抽象类。上面的代码里面,task就是我们自己定义的实现了timertask的类,因为是在同一个包里面,所以没有显性的import进来。task类的代码如下

    packagetest;

    importjava.util.timertask;

    publicclasstaskextendstimertask{publicvoidrun()

    {

    system.out.println("定时任务执行");

    }

    }

    我们的task必须实现timertask的方法run,要执行的任务就在这个run方法里面,这里,我们只让它往控制台打一行字。第二个参数第二个参数是一个long型的值。这是延迟的时间,就是从程序开始以后,再过多少时间来执行定时任务。这个long型的值是毫秒数,所以前面我们的程序里面,过一分钟后执行用的参数值就是60*1000。二、循环执行设置定时任务的时候,往往我们需要重复的执行这样任务,每隔一段时间执行一次,而上面的方法是只执行一次的,这样就用到了schedule方法的是另一个重载函数publicvoidschedule(timertasktask,longdelay,longperiod)

    前两个参数就不用说什么了,最后一个参数就是间隔的时间,又是个long型的毫秒数(看来java里涉及到时间的,跟这个long是脱不了干系了),比如我们希望上面的任务从第一次执行后,每个一分钟执行一次,第三个参数值赋60*1000就ok了。三、指定执行时间既然号称是定时任务,我们肯定希望由我们来指定任务指定的时间,显然上面的方法就不中用了,因为我们不知道程序什么时间开始运行,就没办法确定需要延时多少。没关系,schedule四个重载的方法还没用完呢。用下面这个就ok了:

    publicvoidschedule(timertasktask,datetime)

    比如,我们希望定时任务2006年7月2日0时0分执行,只要给第二个参数传一个时间设置为2006年7月2日0时0分的date对象就可以了。有一种情况是,可能我们的程序启动的时候,已经是2006年7月3日了,这样的话,程序一启动,定时任务就开始执行了。schedule最后一个重载的方法是publicvoidschedule(timertasktask,datefirsttime,longperiod)

    没必要说什么了吧:)四、j2ee中的定时任务在实际的项目中,往往定时任务需要对web工程中的资源进行操作,这样一来,用上面的单个程序的方式可能就有点力不从心了,因为很多web工程的资源它操作不到。解决的办法是,使用servlet,把执行定时任务的那些代码放到servlet的init()函数里就可以了,这个easy,就没有必要再写示例代码了吧

    展开全文
  • 请协助解决, 以下是自己做的一个小程序 . 想让输入的时间(秒) 按倒计时的方法,再显示出来. 但问题是 : 显示到最后 1秒 才出来, import time import tkinter as tk from os import system PC_UI = tk.Tk...
  • 这个是我在网上找的不知道是不是你要的:java定时任务...一、延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行。代码如下:package test;import java.util.Timer...

    这个是我在网上找的不知道是不是你要的:

    java定时任务Timer 关于定时任务,似乎跟时间操作的联系并不是很大,但是前面既然提到了定时任务,索性在这里一起解决了。设置定时任务很简单,用Timer类就搞定了。一、延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行。代码如下:

    package test;

    import java.util.Timer;

    public class TimeTaskTest {

    public static void main(String[] args){ Timer timer = new Timer();

    timer.schedule(new Task(), 60 * 1000);

    }

    }

    解释一下上面的代码。上面的代码实现了这样一个功能,当TimeTask程序启动以后,过一分钟后执行某项任务。很简单吧:先new一个Timer对象,然后调用它的schedule方法,这个方法有四个重载的方法,这里我们用其中一个,

    public void schedule(TimerTask task,long delay)

    首先,第一个参数第一个参数就是我们要执行的任务。这是一个TimerTask对象,确切点说是一个实现TimerTask的类的对象,因为TimerTask是个抽象类。上面的代码里 面,Task就是我们自己定义的实现了TimerTask的类,因为是在同一个包里面,所以没有显性的import进来。Task类的代码如下

    package test;

    import java.util.TimerTask;

    public class Task extends TimerTask { public void run()

    {

    System.out.println("定时任务执行");

    }

    }

    我们的Task必须实现TimerTask的方法run,要执行的任务就在这个run方法里面,这里,我们只让它往控制台打一行字。第二个参数第二个参数是一个long型的值。这是延迟的时间,就是从程序开始以后,再过多少时间来执行定时任务。这个long型的值是毫秒数,所以前面我们的程序里面,过一分钟后执行用的参数值就是 60 * 1000。二、循环执行设置定时任务的时候,往往我们需要重复的执行这样任务,每隔一段时间执行一次,而上面的方法是只执行一次的,这样就用到了schedule方法的是另一个重载函数public void schedule(TimerTask task,long delay,long period)

    前两个参数就不用说什么了,最后一个参数就是间隔的时间,又是个long型的毫秒数(看来java里涉及到时间的,跟这个long是脱不了干系了),比如我们希望上面的任务从第一次执行后,每个一分钟执行一次,第三个参数值赋60 * 1000就ok了。三、指定执行时间既然号称是定时任务,我们肯定希望由我们来指定任务指定的时间,显然上面的方法就不中用了,因为我们不知道程序什么时间开始运行,就没办法确定需要延时多少。没关系,schedule四个重载的方法还没用完呢。用下面这个就OK了:

    public void schedule(TimerTask task,Date time)

    比如,我们希望定时任务2006年7月2日0时0分执行,只要给第二个参数传一个时间设置为2006年7月2日0时0分的Date对象就可以了。有一种情况是,可能我们的程序启动的时候,已经是2006年7月3日了,这样的话,程序一启动,定时任务就开始执行了。schedule最后一个重载的方法是public void schedule(TimerTask task,Date firstTime,long period)

    没必要说什么了吧:)四、j2ee中的定时任务在实际的项目中,往往定时任务需要对web工程中的资源进行操作,这样一来,用上面的单个程序的方式可能就有点力不从心了,因为很多web工程的资源它操作不到。解决的办法是,使用Servlet,把执行定时任务的那些代码放到Servlet的init()函数里就可以了,这个easy,就没有必要再写示例代码了吧

    取消

    评论

    展开全文
  • 函数调用关系:(延时任务的clock减少的函数调用) usrClock-->tickAnnounce-->...系统中有一个全局队列定义如下,就是专门存放等待任务的。 Q_HEAD tickQHead;tickQHead队列的结构体定义: typedef struct { Q_N

    函数调用关系:(延时任务的clock减少的函数调用)

    usrClock-->tickAnnounce-->windTickAnnounce-->Q_ADVANCEN

    先说一下等待任务的时间片减少。
    系统中有一个全局队列定义如下,就是专门存放等待任务的。
    Q_HEAD	  tickQHead;
    tickQHead队列的结构体定义:
    typedef struct		
        {
        Q_NODE  *pFirstNode;	/*第一个任务的节点*/
        UINT     qPriv1;		/**/
        UINT     qPriv2;		/**/
        Q_CLASS *pQClass;		/*每一类都对应一个操作函数集*/
        } Q_HEAD;
    

    每个类对应的操作函数集:
    typedef struct q_class		/* Q_CLASS */
        {
        FUNCPTR createRtn;		/* create and initialize a queue */
        FUNCPTR initRtn;		/* initialize a queue */
        FUNCPTR deleteRtn;		/* delete and terminate a queue */
        FUNCPTR terminateRtn;	/* terminate a queue */
        FUNCPTR putRtn;		/* insert a node into q with insertion key */
        FUNCPTR getRtn;		/* return and remove lead node routine */
        FUNCPTR removeRtn;		/* remove routine */
        FUNCPTR resortRtn;		/* resort node to new priority */
        FUNCPTR advanceRtn;		/* advance queue by one tick routine */
        FUNCPTR getExpiredRtn;	/* return and remove an expired Q_NODE */
        FUNCPTR keyRtn;		/* return insertion key of node */
        FUNCPTR calibrateRtn;	/* calibrate every node in queue by an offset */
        FUNCPTR infoRtn;		/* return array of nodes in queue */
        FUNCPTR eachRtn;		/* call a user routine for each node in queue */
        FUNCPTR restoreRtn;         /* restore a node position in queue */
        FUNCPTR nextRtn;		/* return next node in a queue */
        struct q_class *valid;	/* valid == pointer to queue class */
        } Q_CLASS;
    
    这是系统时钟的中断函数,在这个函数里面对时间片进行了减少操作。

    void windTickAnnounce (void)
    {
    	....
           Q_ADVANCEN (&tickQHead, 1);
    	....
    }
    

    减少队列上任务的时间片具体操作操作:

    #define Q_ADVANCEN(pQHead, n)						\
        if (((Q_HEAD *)pQHead)->pQClass->valid == qPriDeltaClassId &&	\
    	((Q_HEAD *)pQHead)->pFirstNode != NULL)				\
    	{								\
    	if (n > ((Q_PRI_NODE *)((Q_HEAD *)pQHead)->pFirstNode)->key)	\
    	    ((Q_PRI_NODE *)((Q_HEAD *)pQHead)->pFirstNode)->key = 0;	\
    	else								\
    	    ((Q_PRI_NODE *)((Q_HEAD *)pQHead)->pFirstNode)->key -= n;	\
    	}
    
    typedef struct		
        {
        DL_NODE	node;	/*组成队列的节点*/
        ULONG	key;	/*任务的延迟时间*/
        } Q_PRI_NODE;
    
    分开说明:

    (((Q_HEAD *)pQHead)->pQClass->valid == qPriDeltaClassId &&	\
    	((Q_HEAD *)pQHead)->pFirstNode != NULL)
    这句话,首先判定tickQHead的操作函数集是否是qPriDeltaClassId,然后在判断第一个节点是否为空,如果都成立,接着往下执行。

    if (n > ((Q_PRI_NODE *)((Q_HEAD *)pQHead)->pFirstNode)->key)	\
    	    ((Q_PRI_NODE *)((Q_HEAD *)pQHead)->pFirstNode)->key = 0;	\
    
    当1大于第一个节点的key(延时时间)时,就赋值为0,否则减去1.


    这里就出现一个问题,每次操作时间片时,系统竟然只是操作第一个节点的时间片值,后面任务的时间片没有动,这是怎么回事呢?
    问题方后面解释,先来看看把任务放到等待队列时的操作:

    把任务放入到队列的操作函数:
    void qPriDeltaPut
        (
        Q_PRI_HEAD  *pQPriHead,  /*要放入的等待队列*/ 
        Q_PRI_NODE  *pQPriNode,  /*要操作的任务节点*/ 
        ULONG       key	     /*延时时间*/ 
        )
        {
        /*得到队列的第一个节点*/
        FAST Q_PRI_NODE *pQNode = (Q_PRI_NODE *) DLL_FIRST (pQPriHead);
    
        pQPriNode->key = key;		/*为要操作的任务赋值等待时间*/
    
    /*判断是否是空队列,如果是空队列就把任务放入到最后。*/
        while (pQNode != NULL)		
            {
    /*如果要插入任务的延时值小于pQNode的时间,就插入到pQNode前面,并把pQNode的时间减少要插入任务的延时时间;如果延时时间大于pQNode的时间,就把pQPriNode的延时时间减去pQNode的时间并h插入到pQNode的后面*/
    	if (pQPriNode->key < pQNode->key)
    	    {
    	    dllInsert (pQPriHead, DLL_PREVIOUS (&pQNode->node),
    		       &pQPriNode->node);
    
    	    /* Now decrement the delta key of the guy behind us. */
    
    	    pQNode->key -= pQPriNode->key;
    	    return;				/* we're done */
    	    }
    
    	pQPriNode->key -= pQNode->key;
    	pQNode = (Q_PRI_NODE *) DLL_NEXT (&pQNode->node);
    	}
    
        dllInsert (pQPriHead, (DL_NODE *) DLL_LAST (pQPriHead), &pQPriNode->node);
        }
    



    咱们列举一个例子来解答这个问题:
    有三个任务,都延时自己后面执行,A延时15秒,B延时16秒,C延时17秒,看清楚了,这三个任务插入到队列中就成了这样:
    第一个:A延时15秒
    第二个:B延时1秒,
    第三个:C延时2秒,

    这个时候B,D的值分别是和A的差值,随后时钟运行,减少延迟时间时,每次只减少第一个,后面不动,当A到时间时,B就变为了第一个,这个B已经延时15秒了,加上准备延时的时间1秒,正好是设定的延时16秒,同理C任务也是这样的。
    这样有什么好处呢?
    不管有多少任务,只需要操作第一个,真的是大大的方便了不少啊。










    展开全文
  • //定义一个变量,用来给P1口赋值 void main() { aa=0xfe; //1111 1110 while (1) { P1=aa; //点亮第一个发光二极管 delayms(500); //延时500ms aa=_crol_(aa,1); //将AAA循环左移一位后...
  • 你必须知道的495C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 1.22 如何声明返回指向同类型函数的指针的函数?我在设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针。可我...
  •  //定义一个变量,用来给P1口赋值 void main() {<!-- -->  aa=0xfe; //1111 1110  while (1)  {<!-- -->  P1=aa; //点亮第一个发光二极管  delay...
  • 这样在两次定时器中断之间,由于需要执行一部分程序,会存在一个最小的延时。这种方法可以产生15.6K 占空比在6%~94%之间可满足精度要求的占空比。但存在的问题是需要有三个PWM输出,而且是中心对齐。如果在同一个...
  • 《你必须知道的495C语言问题》

    热门讨论 2010-03-20 16:41:18
    例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 11  1.22 如何声明返回指向同类型函数的指针的函数?我在设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针...
  • 例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 11  1.22 如何声明返回指向同类型函数的指针的函数?我在设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针...
  • 单片机 keil流水灯实验

    千次阅读 2010-02-08 02:11:00
    做流水灯实验以前,必须先弄清楚各个发光二极管是怎么控制的,其次,在了解了keil的内部左移右移函数,就可以写...此外还要写一个延时函数,可以是带参数的,也可以不带。在while大循环里,不能忘了点亮一盏灯,就要把

    做流水灯实验以前,必须先弄清楚各个发光二极管是怎么控制的,其次,在了解了keil的内部左移右移函数,就可以写出比较简短的流水灯的实验代码。

    在写的过程中遇到过一些问题,怎么控制灯的走向,应该用一个怎么样的变量来实现传递,这个很重要。

    解决的方法是定义一个unsigned char型变量。

    此外还要写一个延时函数,可以是带参数的,也可以不带。

    在while大循环里,不能忘了点亮一盏灯,就要把它关上。

     

    #include<reg52.h>
    #include <intrins.h>   //包含有左右循环移位子函数的库
    #define uint unsigned int
    void delay()               //延时函数,实现500ms延时
    {
         uint x,y;
         for(x=200;x>0;x--)
             for(y=625;y>0;y--); 
    }
    void main()

         unsigned char temp;    //定义变量,控制灯
         temp=0xfe;                 //总线的方法,temp初值是11111110
         while(1)                      //死循环,使灯可以一直循环,实现流水作业
         {
              P1=temp;              //点亮第一个二极管
              delay();                 //延时500ms
              P1=0xff;                //关闭所有二极管
              temp=_crol_(temp,1);     //左移函数,如果是右移,就用_cror_(temp,1);其中1代表每次向右移动一位
         }
    }

     

    展开全文
  • //执行条指令12周期,12/11.059M =1.08507us 10ms需要9216周期 TH0=56320/256; //重装初值 TL0=56320%256; c1++; if(c1>400){ LED1=0; } if(c1>600) { LED1=1; c1=0;...
  • 你必须知道的495C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    1.6 我似乎不能成功定义一个链表。我试过typedef struct f char *item; NODEPTR next; g *NODEPTR; 但是编译器报了错误信 息。难道在C语言中一个结构不能包含指向自己的指针吗? . . . . 3 1.7 怎样建立和理解非常...
  • 1:清屏printf(“\033c”); 2:延时sleep(1);延时1s 3:getchar()一方面,实现...1)单独写一个.h文件把要用到的#include全部包含进去,结构体定义也写这里,宏替换也写这里,函数申明也写这里 2)函数部分一个
  • //总线读取一个数据位 uchar DS18B20_ReadDQ(void) { uchar DQ_S=0; P1OUT = 0x00; //8个DQ 线全部设置为低电平 DelayNus(6); P1OUT = 0xff; DelayNus(8); P1DIR = 0x00; //准备读取 _NOP(); //延时待总线...
  • -修正Tree控件的一个BUG(定义Mappings属性时)。 +PageManager.Instance应该存在于HttpContext.Current,而不是一个全局变量。 -这个BUG导致Asp.net compatibility中的示例无法完成,现在已经修正。 +去除...
  • 9.8 为什么用const说明的常量不能用来定义一个数组的初始大小? 9.9 字符串和数组有什么不同? 第10章 位(bit)和字节(byte) 10.1 用什么方法存储标志(flag)效率最高? 10.2 什么是“位屏蔽(bit masking)”...
  • C语言编程要点

    2017-09-18 00:10:37
    9.8. 为什么用const说明的常量不能用来定义一个数组的初始大小? 145 9.9. 字符串和数组有什么不同? 145 第10章 位(bit)和字节(byte) 147 10.1. 用什么方法存储标志(flag)效率最高? 147 10.2. 什么是“位屏蔽(bit ...
  • 例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? o 2.8 函数只定义了一次, 调用了一次, 但编译器提示非法重定义了。 o 2.9 main() 的正确定义是什么? void main() 正确吗? o 2.10 对于没有...
  • ES6 实现自己的 Promise

    2020-12-26 19:05:55
    /*创建一个延时resolve的pormise*/ new Promise((resolve, reject) => {setTimeout(() => resolve(5), 2000)}).then(data => console.log(data)) // 5 /*创建一个及时resolve的promise*/ new ...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    在Jamendo中,主要是通过再定义一个SeparatedListAdapter来进行这个工作,我们来看看它是怎么实现的:我理解的Adapter过程,首先通过调用getCount()来获得总Row数目,然后对一行调用getView进行绘制,因此要实现在...
  • stm32的.c文件的东西全都写在了.h里面,为什么还能不编译出错,下载在板子里也是对的,自己尝试过分成.c和.h文件,但是会报很多的错,怎么能分离出来呢? 部分代码如下: ``` static u8 fac_us=0;//us延时倍乘数 ...
  • L610的初始化过程有些不太清楚,看at_device_l610.c文件,是在其中创建了一个初始化的线程并直接调用了,这个怎么能在main中统一初始化呢,现在是在main中延时了10秒等待初始化完成后再执行mqtt等初始化。...
  • 在write后面加个延时函数 sleep 之后可以完整读到数据 但我老师说串口这种即时通讯怎么能延时 不合逻辑 代码如下: 主函数 main .cpp #include <stdio.h> /*标准输入输出定义*/ #include <stdlib.h> /*标准...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    -修正Tree控件的一个BUG(定义Mappings属性时)。 +PageManager.Instance应该存在于HttpContext.Current,而不是一个全局变量。 -这个BUG导致Asp.net compatibility中的示例无法完成,现在已经修正。 +去除...
  • /* 星期,每位代表天 */ UCHAR resv3; }PERIOD_STRUCT; //Camer系统配置(32字节) typedef struct { //4字节 BYTE CamerType; /* Camer类型CAMER_TYPE_ENUM */ BYTE ImageSize; /* 图像大小,见...
  • 实物LCD1602显示温度为0,其他信息正常显示,仿真一切正常,若将显示温度的函数单独提取成文件,则正常显示温度,不知道怎么改 PS只需看主函数,LCD1602.h和temp.h就行 ``` #include"key.h" #include"lcd1602.h...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

怎么定义一个延时函数