Add timeout to CSV block culling configs
This commit is contained in:
+84
@@ -0,0 +1,84 @@
|
|||||||
|
package com.seibel.distanthorizons.core.config.eventHandlers;
|
||||||
|
|
||||||
|
import com.seibel.distanthorizons.core.config.listeners.IConfigListener;
|
||||||
|
import com.seibel.distanthorizons.core.util.TimerUtil;
|
||||||
|
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
public abstract class AbstractDelayedConfigEventHandler implements IConfigListener
|
||||||
|
{
|
||||||
|
public static final long DEFAULT_TIMEOUT_IN_MS = 2_000L;
|
||||||
|
|
||||||
|
/** how long to wait in milliseconds before applying the config changes */
|
||||||
|
private final long timeoutInMs;
|
||||||
|
private Timer timer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//=============//
|
||||||
|
// constructor //
|
||||||
|
//=============//
|
||||||
|
//region
|
||||||
|
|
||||||
|
public AbstractDelayedConfigEventHandler(long timeoutInMs) { this.timeoutInMs = timeoutInMs; }
|
||||||
|
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//==================//
|
||||||
|
// abstract methods //
|
||||||
|
//==================//
|
||||||
|
//region
|
||||||
|
|
||||||
|
public abstract void onConfigTimeout();
|
||||||
|
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//========//
|
||||||
|
// events //
|
||||||
|
//========//
|
||||||
|
//region
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConfigValueSet()
|
||||||
|
{
|
||||||
|
if (this.timeoutInMs > 0)
|
||||||
|
{
|
||||||
|
this.refreshRenderDataAfterTimeout();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.onConfigTimeout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Calling this method multiple times will reset the timer */
|
||||||
|
private synchronized void refreshRenderDataAfterTimeout() // synchronized to prevent potential threading issues when adding/removing the timer
|
||||||
|
{
|
||||||
|
// stop the previous timer if one exists
|
||||||
|
if (this.timer != null)
|
||||||
|
{
|
||||||
|
this.timer.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a new timer task
|
||||||
|
TimerTask timerTask = new TimerTask()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
AbstractDelayedConfigEventHandler.this.onConfigTimeout();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.timer = TimerUtil.CreateTimer("AbstractDelayedConfigTimer");
|
||||||
|
this.timer.schedule(timerTask, this.timeoutInMs);
|
||||||
|
}
|
||||||
|
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
+11
-44
@@ -27,72 +27,36 @@ import com.seibel.distanthorizons.core.util.TimerUtil;
|
|||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
public class ReloadLodsConfigEventHandler implements IConfigListener
|
public class ReloadLodsConfigEventHandler extends AbstractDelayedConfigEventHandler
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* should be used for user facing UI options
|
* should be used for user facing UI options
|
||||||
* this allows the user a second to click through options before they're applied
|
* this allows the user a second to click through options before they're applied
|
||||||
*/
|
*/
|
||||||
public static ReloadLodsConfigEventHandler DELAYED_INSTANCE = new ReloadLodsConfigEventHandler(2_000L);
|
public static ReloadLodsConfigEventHandler DELAYED_INSTANCE = new ReloadLodsConfigEventHandler(AbstractDelayedConfigEventHandler.DEFAULT_TIMEOUT_IN_MS);
|
||||||
/** should be used for debug options so their change can be seen instantly */
|
/** should be used for debug options so their change can be seen instantly */
|
||||||
public static ReloadLodsConfigEventHandler INSTANT_INSTANCE = new ReloadLodsConfigEventHandler(0);
|
public static ReloadLodsConfigEventHandler INSTANT_INSTANCE = new ReloadLodsConfigEventHandler(0);
|
||||||
|
|
||||||
/** how long to wait in milliseconds before applying the config changes */
|
|
||||||
private final long timeoutInMs;
|
|
||||||
private Timer cacheClearingTimer;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//=============//
|
//=============//
|
||||||
// constructor //
|
// constructor //
|
||||||
//=============//
|
//=============//
|
||||||
|
//region
|
||||||
|
|
||||||
public ReloadLodsConfigEventHandler(long timeoutInMs)
|
public ReloadLodsConfigEventHandler(long timeoutInMs) { super(timeoutInMs); }
|
||||||
{
|
|
||||||
this.timeoutInMs = timeoutInMs;
|
//endregion
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//========//
|
//========//
|
||||||
// events //
|
// events //
|
||||||
//========//
|
//========//
|
||||||
|
//region
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onConfigValueSet()
|
public void onConfigTimeout()
|
||||||
{
|
|
||||||
if (this.timeoutInMs > 0)
|
|
||||||
{
|
|
||||||
this.refreshRenderDataAfterTimeout();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
clearRenderDataCache();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Calling this method multiple times will reset the timer */
|
|
||||||
private synchronized void refreshRenderDataAfterTimeout() // synchronized to prevent potential threading issues when adding/removing the timer
|
|
||||||
{
|
|
||||||
// stop the previous timer if one exists
|
|
||||||
if (this.cacheClearingTimer != null)
|
|
||||||
{
|
|
||||||
this.cacheClearingTimer.cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a new timer task
|
|
||||||
TimerTask timerTask = new TimerTask()
|
|
||||||
{
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
clearRenderDataCache();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
this.cacheClearingTimer = TimerUtil.CreateTimer("RenderCacheClearConfigTimer");
|
|
||||||
this.cacheClearingTimer.schedule(timerTask, this.timeoutInMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void clearRenderDataCache()
|
|
||||||
{
|
{
|
||||||
IDhApiRenderProxy renderProxy = DhApi.Delayed.renderProxy;
|
IDhApiRenderProxy renderProxy = DhApi.Delayed.renderProxy;
|
||||||
if (renderProxy != null)
|
if (renderProxy != null)
|
||||||
@@ -101,5 +65,8 @@ public class ReloadLodsConfigEventHandler implements IConfigListener
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-3
@@ -32,7 +32,9 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
|
|||||||
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
|
import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory;
|
||||||
import com.seibel.distanthorizons.coreapi.util.StringUtil;
|
import com.seibel.distanthorizons.coreapi.util.StringUtil;
|
||||||
|
|
||||||
public class RenderBlockCacheCsvHandler implements IConfigListener
|
import java.util.Timer;
|
||||||
|
|
||||||
|
public class RenderBlockCacheCsvHandler extends AbstractDelayedConfigEventHandler
|
||||||
{
|
{
|
||||||
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
|
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
|
||||||
|
|
||||||
@@ -43,18 +45,22 @@ public class RenderBlockCacheCsvHandler implements IConfigListener
|
|||||||
//=============//
|
//=============//
|
||||||
// constructor //
|
// constructor //
|
||||||
//=============//
|
//=============//
|
||||||
|
//region
|
||||||
|
|
||||||
/** private since we only ever need one handler at a time */
|
/** private since we only ever need one handler at a time */
|
||||||
private RenderBlockCacheCsvHandler() { }
|
private RenderBlockCacheCsvHandler() { super(AbstractDelayedConfigEventHandler.DEFAULT_TIMEOUT_IN_MS); }
|
||||||
|
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//=================//
|
//=================//
|
||||||
// config handling //
|
// config handling //
|
||||||
//=================//
|
//=================//
|
||||||
|
//region
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onConfigValueSet()
|
public void onConfigTimeout()
|
||||||
{
|
{
|
||||||
IWrapperFactory wrapperFactory = SingletonInjector.INSTANCE.get(IWrapperFactory.class);
|
IWrapperFactory wrapperFactory = SingletonInjector.INSTANCE.get(IWrapperFactory.class);
|
||||||
if (wrapperFactory != null)
|
if (wrapperFactory != null)
|
||||||
@@ -64,6 +70,8 @@ public class RenderBlockCacheCsvHandler implements IConfigListener
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user