51 default_pool.submit(new Callable[A] { def call = body }) |
51 default_pool.submit(new Callable[A] { def call = body }) |
52 |
52 |
53 |
53 |
54 /* delayed events */ |
54 /* delayed events */ |
55 |
55 |
56 final class Delay private [Simple_Thread](first: Boolean, delay: => Time, event: => Unit) |
56 final class Delay private [Simple_Thread]( |
|
57 first: Boolean, delay: => Time, cancel: () => Unit, event: => Unit) |
57 { |
58 { |
58 private var running: Option[Event_Timer.Request] = None |
59 private var running: Option[Event_Timer.Request] = None |
59 |
60 |
60 private def run: Unit = |
61 private def run: Unit = |
61 { |
62 { |
67 |
68 |
68 def invoke(): Unit = synchronized |
69 def invoke(): Unit = synchronized |
69 { |
70 { |
70 val new_run = |
71 val new_run = |
71 running match { |
72 running match { |
72 case Some(request) => if (first) false else { request.cancel; true } |
73 case Some(request) => if (first) false else { request.cancel; cancel(); true } |
73 case None => true |
74 case None => true |
74 } |
75 } |
75 if (new_run) |
76 if (new_run) |
76 running = Some(Event_Timer.request(Time.now() + delay)(run)) |
77 running = Some(Event_Timer.request(Time.now() + delay)(run)) |
77 } |
78 } |
78 |
79 |
79 def revoke(): Unit = synchronized |
80 def revoke(): Unit = synchronized |
80 { |
81 { |
81 running match { |
82 running match { |
82 case Some(request) => request.cancel; running = None |
83 case Some(request) => request.cancel; cancel(); running = None |
83 case None => |
84 case None => cancel() |
84 } |
85 } |
85 } |
86 } |
86 |
87 |
87 def postpone(alt_delay: Time): Unit = |
88 def postpone(alt_delay: Time): Unit = synchronized |
88 { |
89 { |
89 running match { |
90 running match { |
90 case Some(request) => |
91 case Some(request) => |
91 val alt_time = Time.now() + alt_delay |
92 val alt_time = Time.now() + alt_delay |
92 if (request.time < alt_time && request.cancel) { |
93 if (request.time < alt_time && request.cancel) { |
|
94 cancel() |
93 running = Some(Event_Timer.request(alt_time)(run)) |
95 running = Some(Event_Timer.request(alt_time)(run)) |
94 } |
96 } |
95 case None => |
97 else cancel() |
|
98 case None => cancel() |
96 } |
99 } |
97 } |
100 } |
98 } |
101 } |
99 |
102 |
100 // delayed event after first invocation |
103 // delayed event after first invocation |
101 def delay_first(delay: => Time)(event: => Unit): Delay = new Delay(true, delay, event) |
104 def delay_first(delay: => Time, cancel: () => Unit = () => ())(event: => Unit): Delay = |
|
105 new Delay(true, delay, cancel, event) |
102 |
106 |
103 // delayed event after last invocation |
107 // delayed event after last invocation |
104 def delay_last(delay: => Time)(event: => Unit): Delay = new Delay(false, delay, event) |
108 def delay_last(delay: => Time, cancel: () => Unit = () => ())(event: => Unit): Delay = |
|
109 new Delay(false, delay, cancel, event) |
105 } |
110 } |
106 |
|