SWT, TypedEvent: как использовать переменную времени

#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, которые могли бы вам помочь. удачи