a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 145|回复: 2

[软件设计师] 计算机软考软件设计师:时间陷阱

[复制链接]
发表于 2012-8-2 09:08:23 | 显示全部楼层 |阅读模式
时间陷阱。它能是主程序的运行和对事件的处理异步进行。通过设置时间陷阱。可以在规定的时间间隔到达后自动执行某个子程序。子程序运行结束后又回到主程序的断点处继续执行。basic语言提供了有关时间陷阱的语句。可以直接调用。但C语言没有这样的功能,为了能实现上述功能,这里给出了几个子函数以帮助实现。    #include3 l- R" A) G$ }8 `( a6 `
    #define Sizeprogram 375
$ a0 O& n: y# j: o3 h0 E- D0 A    void interrupt (*oldtimer)();2 I/ F7 c) I. Y( }* G: C( m
    void interrupt newtimer();
/ H: _4 c7 ~, ]' [) M( v    static strUCt SREGS seg;
5 R+ O8 i  `% n6 n  W: Q) c8 ]2 c    unsigned intsp,intss;0 U: ^) Q! a2 e: s+ C9 `  q
    unsigned myss,stack;
" c+ q: r; h, _0 t, Z+ C! _    unsigned vseg;) a) w( P4 E3 V% w. P+ m0 x
    int running=0;
5 _9 u1 P$ |" Y    int m1,m2,m3=0;+ |8 A  Z2 l# B* s6 E
    int (*sub_ptr)();# t7 l. i/ n7 _: X6 {
    void on_timer();3 {$ F3 S( r( Y  x- E! }2 v( z
    void timer_on();
6 A; |" P9 S$ `    void timer_off();
. Z* I; l& `" {3 N; g  |    void on_timer(t,pp);
' i2 j) D- l" Z    int t;; {" q; ~& k) A! }
    int (*pp)();3 r  \8 v1 A" m2 \8 j( [
    {
1 F* j; B8 I& Q/ I    sub_ptr=pp;7 J  A* q  W; n* q  J
    m1=t;+ Q# c. B& T9 o8 @- u
    segread(&seg);0 T& Q! T9 F9 q, {+ j5 `- z
    stack=(Sizeprogram-(seg.ds-seg.cs))*16-300;
回复

使用道具 举报

 楼主| 发表于 2012-8-2 09:08:24 | 显示全部楼层

计算机软考软件设计师:时间陷阱

myss=_SS;
* v# C! d7 b+ i0 e: B/ a    oldtimer=getvect(0x1c);0 N) B( N0 y! S& w1 ]7 i3 J# v
    }5 J/ h2 }/ _; ]: P) a  H. f$ q( D8 ^6 Z
    void timer_on()
8 I3 @' o  ]) Z4 E2 Q" r    {; \3 |8 t, I3 S; |4 r
    m2=0;% t: F; y4 w) i$ w
    m3=1;
! R0 [% m* O; \- N1 V7 q1 y    setvect(0x1c,newtimer);, T# t2 z; G5 v) e5 K
    }  T) ?$ a( I( u, R- V
    void timer_off()# ^8 E2 Q8 V6 ~
    {6 L) F/ P. x. l, O
    m3=0;" Z4 C9 p) `, |" G& U
    setvect(0x1c,oldtimer);# v% l+ U% |# S8 G) b
    }# ~- V$ x. O5 k$ D' s" E
    void interrupt newtimer(), m9 B- s- h- b9 p" y9 f
    {9 Z: w+ d. ^& Y
    (*oldtimer)();. V. E2 q/ x$ S. d) G8 J
    if(running==0)
0 J; w" m$ ]$ w/ |, g. l  [0 B4 O    running=1;( Z6 Y: W7 w2 c/ Y7 |
    disable();" M+ r; `: R; x. V
    intsp=_SP;  g. j+ G/ a4 u0 {) ^- ?
    intss=_SS;1 Z. D$ N2 k7 G: Z
    _SP=stack;/ g& R1 z8 `$ D% Q1 k: j0 e0 i
    _SS=myss;
) p' D1 }) h6 Y# [& v' H    enable();
& N2 N5 O5 @- m    if(m3==1){! o) h9 }  L2 V4 V
    if(m2==m1*18){1 S; w/ H: L  ]) B" m+ g, H8 ]
    m2=0;" m  z+ V6 K7 e$ I# g. S* o3 I' U" a
    (*sb_ptr)();
/ X2 u% K  |1 u9 _5 V8 ^/ p% R    }1 u+ N7 o! U) y- _% k
    m2+=1;
$ t5 n& r6 g) D3 @* N4 |    }  ^* m- B& X9 u  \5 Y' W+ Q
    disable();
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 09:08:25 | 显示全部楼层

计算机软考软件设计师:时间陷阱

_SP=intsp;' B0 s& i6 I/ x+ a3 k1 Q+ b
    _SS=intss;+ F. Z, v7 \! T  t
    enable();: A: L) X$ x+ x% Z
    running=0;
, z2 ^) B  _8 q- w2 r    }" X# l6 j. Z# Z+ R' k- M7 e2 L
    }8 R( k3 N1 V; P# V" H
    #include# J* T( L" @' k8 n% s2 k
    #define TRUE 1& d& E  `4 B; l# `; E: G
    void ptr();
$ A7 J- V$ u$ `8 g/ _    main()
/ l: V% ]5 }* w9 M    {
' ]  M: W, _6 W    char ch;
. M+ u+ S4 S0 w; K# m    char *p:2 C8 u) \: _" e' z/ i1 S" m
    p=(char *)ptr;
& f7 O0 a1 h1 n( y1 J0 R, k    on_timer(t,p);
4 S+ F# ]$ n. x$ G    while(TRUE){4 O: \% L- w, K* r: ?2 Z! s
    ch=getch();' Z8 ~# S3 K& `( O
    switch(ch){
& S2 g. h& o* F; Q, J' E    case ''0'': timer_off();break;
5 n( [- m9 `- S) [; H    case ''1'': timer_on();break;# F6 @: E; ?: R4 l6 X
    case ''2'': timer_off();brea;
$ j# e5 F' f8 ?  h2 D  G4 m7 Y; \9 R    default: printf(“%c”,ch);
2 y' ^4 P- r' O6 H& E  |    }' l# z' K$ m* A2 @
    }5 Y6 _3 b2 Z+ F- @
    }
  p- T/ n" n# S6 ?8 g( I! d, ~    void ptr()- ]* M( _" ^& ]  g+ q! K6 T
    {
4 x) @6 {' R, j* [    union REGS in,out;, I4 b& k6 b2 ~( ?: E
    in.h.al=''A'';
" G+ h( s1 t/ t$ ^" @% J7 e    in.h.ah=14;
5 x; L$ {  U( B" {    int86(0x10,&in,&out);8 p" k( V5 [# b( V' `
    }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 07:21 , Processed in 0.236090 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表