1 | // run = trigger (for convenience) |
2 | sclass ReliableExecuteAfterChange is Runnable, AutoCloseable { |
3 | Runnable action; |
4 | IActionScheduler actionScheduler; |
5 | bool trigger; |
6 | bool running; |
7 | ScheduledAction thread; |
8 | |
9 | *(Runnable *action, IActionScheduler *actionScheduler) {} |
10 | *(IActionScheduler *actionScheduler, Runnable *action) {} |
11 | |
12 | bool cancelBeforeTrigger; // always cancel running thread and wait for it to end before starting new operation |
13 | bool waitBetweenCancelAndTrigger; // make sure the old thread is actually ended |
14 | bool cancelOnClose; |
15 | int cancelTimeOut = 10000; |
16 | |
17 | synchronized public void trigger aka run aka get() { |
18 | if (trigger) |
19 | if (cancelBeforeTrigger) cancelAndPossiblyWait(); |
20 | trigger = true; |
21 | shouldRun = !running()) |
22 | starting |
23 | thread = actionScheduler.start(r _run); |
24 | } |
25 | |
26 | synchronized bool running() { ret thread != null; } |
27 | |
28 | // use only if this is the last time you trigger this |
29 | void triggerAndWait() { |
30 | trigger(); |
31 | waitUntilDone(); |
32 | } |
33 | |
34 | void waitUntilDone { |
35 | while (running()) sleep(1); |
36 | } |
37 | |
38 | private void _run() ctex { |
39 | while true { |
40 | synchronized(this) { |
41 | if (!trigger) |
42 | ret; |
43 | running = true; |
44 | trigger = false; |
45 | } |
46 | |
47 | try { |
48 | action?!; |
49 | } finally { |
50 | synchronized(this) { |
51 | running = false; |
52 | } |
53 | } |
54 | } |
55 | |
56 | close { |
57 | if (cancelOnClose) |
58 | cancel(); |
59 | } |
60 | |
61 | void cancel() { |
62 | ScheduledAction toCancel; |
63 | synchronized { toCancel = thread; } |
64 | if (toCancel == null) ret; |
65 | cancelAndInterruptScheduledAction(toCancel); |
66 | } |
67 | |
68 | void cancelAndWait() { |
69 | Thread _thread; |
70 | |
71 | synchronized { |
72 | if (thread == null) ret; |
73 | _thread = thread; |
74 | threadBeingCancelled = new WeakReference(thread); |
75 | thread = null; |
76 | } |
77 | |
78 | cancelAndInterruptThread(_thread); |
79 | } |
80 | |
81 | void cancelAndTrigger() { |
82 | cancelAndPossiblyWait(); |
83 | trigger(); |
84 | } |
85 | |
86 | synchronized bool triggered() { ret trigger; } |
87 | |
88 | selfType cancelBeforeTrigger() { |
89 | cancelBeforeTrigger = true; |
90 | this; |
91 | } |
92 | |
93 | void cancelAndPossiblyWait() { |
94 | if (waitBetweenCancelAndTrigger) |
95 | cancel(); |
96 | } |
97 | } |
Began life as a copy of #1006319
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1033541 |
Snippet name: | ReliableExecuteAfterChange [dev.] - replacement for ReliableSingleThread/RSTOverQ with new execution constructs [dev.] |
Eternal ID of this version: | #1033541/4 |
Text MD5: | ff69aa55c6978baa2abab6dea33a68d6 |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2021-11-01 23:49:10 |
Source code size: | 2260 bytes / 97 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 143 / 163 |
Version history: | 3 change(s) |
Referenced in: | [show references] |