SWT выходят с syncExec ()

Это - мой первый вопрос на StackOverflow (извините о моем английском языке). Я попытаюсь объяснить проблему также, я могу.

У меня есть swt приложение с приоритетным нефритовым приложением, в котором у меня есть индикатор выполнения для информирования продолжительности приложения. Для обновления этого индикатора выполнения, я использую:

if(Display.getCurrent() != null) {
    progress.run();
}
else {
   sShell.getDisplay().syncExec(progress);
}

Прогресс:

Runnable progress = new Runnable() {
    public void run () {
        if (progressBar.isDisposed ()) 
            return;
        int percentage= (numStep*100)/maxSteps;
        progressBar.setSelection(percentage);
        if (numStep >= maxSteps){
            label1.setText("The simulation has been completed.");
            button.setEnabled(true);
        }    
    }
};

Я пытаюсь проанализировать время, когда это Выполнимые взятия и оно являются постоянными, но когда я анализирую эту строку sSehll.getDisplay().syncExec(progress) занимает различные времена (от 0ms до XXXXms)

Я считал это

syncExec (Выполнимый выполнимый) вызывает текущий поток (если это отличается, чем поток пользовательского интерфейса дисплея) ожидать выполнимого для окончания.

Но Выполнимой является временная константа...

Кто-то может вести меня? Я не понимаю, почему иногда занимает 3 минуты и некоторое другое время.

Спасибо

7
задан Mike Causer 28 January 2014 в 11:52
поделиться

2 ответа

В классе SWT Display есть два метода, syncExec и aSyncExec. Они оба используются, когда у вас есть поток, не являющийся потоком пользовательского интерфейса, который хочет каким-то образом обновить пользовательский интерфейс. Вызывая их, вы, по сути, говорите потоку пользовательского интерфейса, что у вас есть что-то, что вы хотите, чтобы он сделал, когда у него появится шанс. Таким образом, поток UI продолжит свою текущую работу и в какой-то момент сделает то, о чем вы его попросили. Когда это произойдет, всегда будет зависеть от того, какую другую работу поток пользовательского интерфейса должен выполнить в это время.

Разница между aSyncExec и syncExec заключается в том, ожидает ли код, который его вызывает, завершения выполнения. Если вы вызываете aSyncExec, то выполнение следующего оператора в вызывающем потоке будет выполнено немедленно. Если вы вызовете syncExec, то ваш вызывающий поток будет сидеть и ждать, пока UI Thread фактически выполнит код и вернется. Задавая время выполнения syncExec, вы тем самым определяете не только время выполнения метода run, но и время до того, как поток UI действительно начнет его выполнять.

Не поддавайтесь искушению поменять syncExec на aSyncExec. Если вы засечете время, необходимое aSyncExec для выполнения, то обнаружите, что он даже быстрее. Но это потому, что вы засекаете только время, необходимое для того, чтобы сообщить потоку пользовательского интерфейса, что у вас есть что-то, что он должен сделать (а не время, необходимое для того, чтобы это сделать).

3
ответ дан 7 December 2019 в 14:31
поделиться

Согласно документации класса Display, syncExec:

Вызывает метод run() из runnable быть вызванным потоком пользовательского интерфейса при следующей reasonable opportunity. Поток который вызывает этот метод, приостанавливается пока не завершится выполняемая программа. Указание null в качестве выполняемой программы просто будит поток пользовательского интерфейса поток.

Таким образом, ваш метод run выполняется в постоянном времени, но объект Display не всегда может вызвать его немедленно.

1
ответ дан 7 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: