Crossfire JXClient, Trunk
EventScheduler.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.items;
24 
25 import org.jetbrains.annotations.NotNull;
26 
35 public class EventScheduler {
36 
41  private final int delay;
42 
47  private final int afterEventDelay;
48 
52  @NotNull
53  private final Runnable eventSchedulerCallback;
54 
59  @NotNull
60  private final Object sync = new Object();
61 
65  @NotNull
66  private final Thread thread;
67 
72  private long nextAction;
73 
77  private long nextActionNotBefore = System.currentTimeMillis();
78 
83  @NotNull
84  private final Runnable runnable = new Runnable() {
85 
86  @Override
87  public void run() {
88  while (true) {
89  try {
90  final long now = System.currentTimeMillis();
91  final boolean fireEvent;
92  synchronized (sync) {
93  if (nextAction == 0) {
94  //noinspection WaitOrAwaitWithoutTimeout
95  sync.wait();
96  fireEvent = false;
97  } else {
98  final long thisDelay = Math.max(nextAction, nextActionNotBefore)-now;
99  if (thisDelay > 0) {
100  sync.wait(thisDelay);
101  fireEvent = false;
102  } else {
103  fireEvent = true;
104  nextAction = 0;
105  nextActionNotBefore = System.currentTimeMillis()+afterEventDelay;
106  }
107  }
108  }
109 
110  if (fireEvent) {
112  }
113  } catch (final InterruptedException ignored) {
114  thread.interrupt();
115  break;
116  }
117  }
118  }
119 
120  };
121 
128  public EventScheduler(final int delay, final int afterEventDelay, @NotNull final Runnable eventSchedulerCallback) {
129  this.delay = delay;
130  this.afterEventDelay = afterEventDelay;
131  this.eventSchedulerCallback = eventSchedulerCallback;
132  thread = new Thread(runnable, "JXClient:EventScheduler");
133  thread.setDaemon(true);
134  }
135 
139  public void start() {
140  thread.start();
141  }
142 
146  public void trigger() {
147  final long now = System.currentTimeMillis();
148  synchronized (sync) {
149  nextAction = now+delay;
150  sync.notifyAll();
151  }
152  }
153 
154 }
com.realtime.crossfire.jxclient.items.EventScheduler.delay
final int delay
Definition: EventScheduler.java:41
com.realtime.crossfire.jxclient.items.EventScheduler.eventSchedulerCallback
final Runnable eventSchedulerCallback
Definition: EventScheduler.java:53
com.realtime.crossfire.jxclient.items.EventScheduler.nextAction
long nextAction
Definition: EventScheduler.java:72
com.realtime.crossfire.jxclient.items.EventScheduler.EventScheduler
EventScheduler(final int delay, final int afterEventDelay, @NotNull final Runnable eventSchedulerCallback)
Definition: EventScheduler.java:128
com.realtime.crossfire.jxclient.items.EventScheduler.nextActionNotBefore
long nextActionNotBefore
Definition: EventScheduler.java:77
com.realtime.crossfire.jxclient.items.EventScheduler.start
void start()
Definition: EventScheduler.java:139
com.realtime.crossfire.jxclient.items.EventScheduler
Definition: EventScheduler.java:35
com.realtime.crossfire.jxclient.items.EventScheduler.trigger
void trigger()
Definition: EventScheduler.java:146
com.realtime.crossfire.jxclient.items.EventScheduler.thread
final Thread thread
Definition: EventScheduler.java:66
com.realtime.crossfire.jxclient.items.EventScheduler.runnable
final Runnable runnable
Definition: EventScheduler.java:84
com.realtime.crossfire.jxclient.items.EventScheduler.afterEventDelay
final int afterEventDelay
Definition: EventScheduler.java:47
com.realtime.crossfire.jxclient.items.EventScheduler.sync
final Object sync
Definition: EventScheduler.java:60