package logbook.gui.background; import java.util.concurrent.TimeUnit; import logbook.data.context.GlobalContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.List; /** * 非同期にコンソールを更新します * */ public final class AsyncExecApplicationMainConsole extends Thread { private static final Logger LOG = LogManager.getLogger(AsyncExecApplicationMainConsole.class); private static final int CYCLE = 500; private static final int MAX_LOG_LINES = 200; private final List console; /** * 非同期にコンソールを更新します * * @param display * @param console */ public AsyncExecApplicationMainConsole(List console) { this.console = console; this.setName("logbook_async_exec_application_main_console"); } /** * 現在のメイン画面を更新します */ @Override public void run() { try { while (true) { // ログメッセージを取り出す String message; while ((message = GlobalContext.getConsoleMessage()) != null) { Display.getDefault().syncExec(new UpdateConsoleTask(this.console, message)); } TimeUnit.MILLISECONDS.sleep(CYCLE); } } catch (Exception e) { LOG.fatal("Thread is aborted", e); throw new RuntimeException(e); } } /** * 非同期にコンソールを更新します */ private static final class UpdateConsoleTask implements Runnable { private final List console; private final String message; /** * 非同期にコンソールを更新します */ public UpdateConsoleTask(List console, String message) { this.console = console; this.message = message; } @Override public void run() { int size = this.console.getItemCount(); if (size >= MAX_LOG_LINES) { this.console.remove(0); } this.console.add(this.message); this.console.setSelection(this.console.getItemCount() - 1); } } }