2010-03-04 1 views
7

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

У меня есть приложение 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); 
     }  
    } 
}; 

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

Я прочитал эту

syncExec (Runnable работоспособный) CAUS текущий поток (если он отличается от потока пользовательского интерфейса на дисплее), чтобы дождаться завершения runnable.

Но Runnable постоянного время ...

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

Благодаря

+1

+1, добро пожаловать в StackOverflow! Я переформатировал ваш код для вас, но вам не нужно извиняться за ваш английский :) –

+0

Спасибо вам. Я знаю, что это сидит долгое время назад, но я был очень рад принять участие сегодня, наконец. – Michel

ответ

1

Согласно Display class documentation, syncExec:

Вызывает метод Run() из работоспособной, который будет вызван в пользовательского интерфейса нити на следующей разумной возможности , Поток , который вызывает этот метод, приостанавливается до завершения выполнения. Задание нулевого значения как runnable просто пробуждает пользовательский интерфейс thread.

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

+0

Я помню, что когда я читал документацию, но нет способа ее заставить? – Michel

+1

И если вы когда-нибудь получите syncExec, чтобы занять три минуты, то, вероятно, вы выполнили код в потоке SWT, который должен быть помещен в фоновый поток. Это позволит UI работать плавно снова. –

3

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

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

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

+0

Но не существует способа выполнить его по-разному? – Michel

+0

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

+0

Да, это связано ... – Michel