public synchronized void sendCommandTimeout(String command, int timeoutSecs,
			DecompInterface.EncodeDecodeSet encodeSet) throws IOException, DecompileException {

		if (!statusGood) {
			throw new IOException(command + " called on bad process");
		}

		paramDecoder = encodeSet.callbackQuery;
		resultEncoder = encodeSet.callbackResponse;
		int validatedTimeoutMs = getTimeoutMs(timeoutSecs);
		GTimerMonitor timerMonitor = GTimer.scheduleRunnable(validatedTimeoutMs, timeoutRunnable);

		try {
			write(command_start);
			writeString(command);
			writeString(Integer.toString(archId));
			writeString(encodeSet.mainQuery);
			write(command_end);
			readResponse(encodeSet.mainResponse);
		}
		catch (IOException e) {
			statusGood = false;
			if (timerMonitor.didRun()) {
				// Timeout occurred
				throw new DecompileException("process", "timeout");
			}
			throw e;
		}
		finally {
			timerMonitor.cancel();
		}
	}
Execute a command with a timeout.  Parameters are in the encodingSet.mainQuery.
The response gets written to encodingSet.mainResponse.  
@param command the decompiler should execute
@param timeoutSecs the number of seconds to run before timing out
@param encodeSet contains encoded parameters and the response container
@throws IOException for any problems with the pipe to the decompiler process
@throws DecompileException for any problems while executing the command
Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/DecompileProcess.java