Я использую SWT в основной графической программе. Внутри я создаю другой поток для запуска некоторых программ. Однако, если некоторые ошибки встречаются в этих процессах, я хочу сообщить об этом пользователю, создав окно сообщения. Поскольку в SWT только один поток может выполнять операции с графическим интерфейсом, у меня были исключения для исключения run-run, поэтому поток GUI мог бы справиться с ними. Однако у меня возникают проблемы, потому что я создаю новый поток для бегуна программы (чтобы не задерживать поток GUI, который будет постоянно обновлять и обновлять некоторые графики), но в результате исключения, которые имеют место, застревают как часть этого потока, который не может создать окно сообщения об ошибке. Любые предложения о том, как с этим бороться? .SWT, несколько потоков и исключений
private void goButtonActionPerformed()
{
// create the program runner object
ProgramRunner PR = new ProgramRunner(); // real code passes in data to be used
try{
// check all necessary parameters are entered
boolean paramsOK = PR.checkParams();
if (paramsOK)
{
// all necessary information is available. Start Processing.
Thread t = new Thread() {
public void run()
{
try{
PR.runPrograms();
}
catch (IOException iox)
{
// This does not work to catch & display the exceptions
// which took place in PR.runPrograms(), because this
// thread is not allowed to perform GUI operations.
// However, I don't know how to pass this
// exception/error notification out of this thread.
MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR);
mb.setMessage(iox.getMessage());
mb.open();
}
}
};
t.start();
}
}
catch (IOException iox)
{
// this works to catch & display the exceptions which took place
// in PR.checkParams() because that is not a separate thread
MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR);
mb.setMessage(iox.getMessage());
mb.open();
}
О, и я понимаю, что PR.checkParams() не нужно возвращать логическое значение, которое нужно проверить, потому что вместо того, чтобы возвращать false, оно просто забросило бы исключение, которое будет обрабатываться здесь. – sacrawford