SWT, TypedEvent: как использовать переменную времени - PullRequest
1 голос
/ 01 мая 2011

Класс TypedEvent имеет переменную-член time.Я хочу использовать это, чтобы отбросить слишком старые события.К сожалению, он относится к типу int, где System.currentTimeMillis() возвращает long, и оба они очень разные, даже если маскировать их с 0xFFFFFFFFL, как говорит мне JavaDoc time.Как следует интерпретировать time?

1 Ответ

2 голосов
/ 02 мая 2011

Примечание: Поскольку вы не упомянули операционную систему, поэтому я смело принимаю ее как 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.time&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 ();

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...