签到

06月20日
尚未签到

共有回帖数 0

    把酒临风

    等级:
    时间陷阱.它能是主程序的运行和对事件的处理异步进行.通过设置时间陷阱.可以在规定的时间间隔到达后自动执行某个子程序.子程序运行结束后又回到主程序的断点处继续执行.basic语言提供了有关时间陷阱的语句.可以直接调用.但C语言没有这样的功能,为了能实现上述功能,这里给出了几个子函数以帮助实现.

    #includedos.h

    #define Sizeprogram 375
    void interrupt (*oldtimer)();
    void interrupt newtimer();
    static struct SREGS seg;
    unsigned intsp,intss;
    unsigned myss,stack;
    unsigned vseg;
    int running=0;
    int m1,m2,m3=0;
    int (*sub_ptr)();
    void on_timer();
    void timer_on();
    void timer_off();

    void on_timer(t,pp);
    int t;
    int (*pp)();
    {
    sub_ptr=pp;
    m1=t;
    segread(&seg);
    stack=(Sizeprogram-(seg.ds-seg.cs))*16-300;
    myss=_SS;
    oldtimer=getvect(0x1c);
    }

    void timer_on()
    {
    m2=0;
    m3=1;
    setvect(0x1c,newtimer);
    }
    void timer_off()
    {
    m3=0;
    setvect(0x1c,oldtimer);
    }
    void interrupt newtimer()
    {
    (*oldtimer)();
    if(running==0)
    running=1;
    disable();
    intsp=_SP;
    intss=_SS;
    _SP=stack;
    _SS=myss;
    enable();
    if(m3==1){
    if(m2==m1*18){
    m2=0;
    (*sb_ptr)();
    }
    m2+=1;
    }
    disable();
    _SP=intsp;
    _SS=intss;
    enable();
    running=0;
    }
    }

    #includedos.h
    #define TRUE 1
    void ptr();
    main()
    {
    char ch;
    char *p:
    p=(char *)ptr;
    on_timer(t,p);
    while(TRUE){
    ch=getch();
    switch(ch){
    case ''0'': timer_off();break;
    case ''1'': timer_on();break;
    case ''2'': timer_off();brea;
    default: printf("%c",ch);
    }
    }
    }

    void ptr()
    {
    union REGS in,out;
    in.h.al=''A'';
    in.h.ah=14;
    int86(0x10,&in,&out);
    }

    楼主 2016-10-13 15:37 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知