#swt
#swt
Вопрос:
У TypedEvent
класса есть переменная-член time
. Я хочу использовать ее для удаления слишком старых событий. К сожалению, это тип, int
где System.currentTimeMillis()
возвращает long
значение as, и оба они очень разные, даже при маскировании их с помощью 0xFFFFFFFFL
, как мне говорит JavaDoc из time
. Как следует time
интерпретировать?
Ответ №1:
Примечание: Поскольку вы не упомянули операционную систему, поэтому я с уверенностью предполагаю, что это Windows (потому что это то, что у меня есть).
Ответ
Если вы внимательно посмотрите на org.eclipse.swt.widgets.Widget
класс, то обнаружите, что TypedEvent.time
он инициализируется следующим образом:
event.time = display.getLastEventTime ();
Которая в ответ вызывает: OS.GetMessageTime ();
Теперь SWT
напрямую работает с виджетами ОС, поэтому на компьютере с Windows вызов OS.GetMessageTime ();
напрямую преобразуется в Windows GetMessageTime API.
Проверьте GetMessageTime в MSDN. Согласно странице:
Возвращает время сообщения для последнего сообщения, полученного функцией GetMessage. Время — это длинное целое число, которое определяет прошедшее время в миллисекундах с момента запуска системы до момента создания сообщения (то есть размещения в очереди сообщений потока).
Обратите особое внимание на строку from the time the system was started to the time the message was created
, которая означает, что это не стандартное System.currentTimeMillis()
время, прошедшее в миллисекундах с 1 января 1970 года.
Кроме того, для вычисления временных задержек между сообщениями убедитесь, что время второго сообщения больше времени первого сообщения; затем вычтите время первого сообщения из времени второго сообщения.
Смотрите приведенный Ниже пример кода, который печатает два разных сообщения за время, меньшее 5 секунд и большее 5 секунд. (Примечание: Следует отметить, что таймер запускается с первым событием. Таким образом, вычисление всегда относительно по отношению к первому событию). Из-за своей относительной природы TypedEvent.time
может не подойти для ваших целей, поскольку первое событие может произойти с большим опозданием.
>> Код
import java.util.Calendar;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class ControlF
{
static Calendar first = null;
public static void main(String[] args)
{
Display display = new Display ();
final Shell shell = new Shell (display);
shell.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e)
{
long eventTime = (e.timeamp;0xFFFFFFFFL) ;
if(first == null)
{
System.out.println("in");
first = Calendar.getInstance();
first.setTimeInMillis(eventTime);
}
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(eventTime);
long dif = (cal.getTimeInMillis() - first.getTimeInMillis())/1000;
if( dif <= 5)
{
System.out.println("Within 5 secs [" dif "]");
}else
System.out.println("Oops!! out of 5 second range !!");
}
});
shell.setSize (200, 200);
shell.open ();
while (!shell.isDisposed()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}
Комментарии:
1. Пока спасибо. Существует ли также Java-метод, который я могу использовать для вычисления разницы между текущим временем и временем события, чтобы я мог легко отбрасывать события (например, нажатия кнопок), которые слишком старые?
2. @Mike L.: Ну
old
это относительный термин. Если ваша ссылка является началом вашего приложения, то вы можете инициализировать там некоторую переменную, сохраняющую время, если ссылка является каким-либо событием, то вы можете запустить свой хранитель времени там. Что касается какой-либо стандартной библиотеки или функции, я ее не использовал. Вы можете поместить это как вопрос на SO. Есть много экспертов по Java, которые могли бы вам помочь. удачи