Невозможно просмотреть события клавиатуры несколько раз в Smalltalk Pharo 2

Я хочу заглянуть в события клавиатуры, и, согласно документации для Sensor, я могу сделать это, не удаляя событие из очереди с помощью peekKeyboardEvent, однако, похоже, это не работает.

Это работает:

"Show that a single event can be checked multiple times"
Transcript clear; show: 'Type something... '; flush.
(Delay forSeconds: 2) wait.
5 timesRepeat: [  
    Transcript show: (Sensor peekEvent); cr
]

Выход:

Type something... #(2 48243801 5 2 8 0 0 1)
#(2 48243801 5 2 8 0 0 1)
#(2 48243801 5 2 8 0 0 1)
#(2 48243801 5 2 8 0 0 1)
#(2 48243801 5 2 8 0 0 1)

Но это не так:

"Show that a single keyboard event can be checked multiple times"
Transcript clear; show: 'Type something... '; flush.
(Delay forSeconds: 2) wait.
5 timesRepeat: [  
    Transcript show: (Sensor peekKeyboardEvent); cr
]

Выход:

Type something... #(2 48205144 97 0 0 97 0 1)
nil
nil
nil
nil

Еще один вопрос: почему Transcript flush не вызывает мгновенное появление вывода? Он появляется только после запуска сценария.


person Eric Clack    schedule 06.05.2013    source источник
comment
Интересно, что, читая вокруг, кажется, что эти методы опроса настоятельно не рекомендуются и что события - это то, что нужно.   -  person Eric Clack    schedule 13.05.2013


Ответы (1)


Во-первых, pharo - это быстро движущаяся цель, поэтому лучше сказать, какая версия.

Лучший способ найти ответ - просмотреть код. Я покажу это в текущей разработке pharo 3.0
Если вы просмотрите разработчиков peekKeyboardEvent (выберите его, затем Alt + m), вы найдете версию в InputEventSensor:

peekKeyboardEvent
    "Allows for use of old Sensor protocol to get at the keyboard,
    as when running kbdTest or the InterpreterSimulator in Morphic"

    ^eventQueue findFirst: [:buf | self isKbdEvent: buf]

Если вы анализируете ссылки inst var на eventQueue

initialize
        "Initialize the receiver"
        super initialize.
        eventQueue := WaitfreeQueue new.
        ...snip...

Затем просмотрите WaitfreeQueue (выберите ее, затем Alt + b)

findFirst: aBlock
    "Note, this method only for backward compatibility. It duplicating the semantics of #nextOrNilSuchThat: completely.
    Use #nextOrNilSuchThat: instead "

    ^ self nextOrNilSuchThat: aBlock

тогда:

nextOrNilSuchThat: aBlock
    "Fetch an object from queue that satisfies aBlock, skipping (but not removing) any intermediate objects.
    If no object has been found, answer <nil> and leave me intact.

    NOTA BENE:  aBlock can contain a non-local return (^).
    Found item is removed from queue    .

    If queue currently in the middle of extraction by other process, don't wait and return <nil> immediately"
    ...snip...

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

Таким образом, действительно кажется, что этот стиль опроса устарел и теряет поддержку в pharo.

person aka.nice    schedule 06.06.2013
comment
Привет, Ака, спасибо за комментарий. Думаю, тогда мы оба согласились, что комментарии непоследовательны. Надеюсь, в Pharo 3 опрос будет удален или методы в InputEventSensor будут очищены, чтобы они не вводили в заблуждение. - person Eric Clack; 07.06.2013