Nano Hash - криптовалюты, майнинг, программирование

Поток Java переходит в спящий режим, когда он не находится в фокусе на OSX

Я пишу программу, которая прослушивает системный буфер обмена на предмет изменений. Слушатель запускается в отдельном потоке и выполняет какое-либо действие (скажем, запись в файл) при изменении содержимого буфера обмена.

Я опрашиваю буфер обмена, используя интерфейс ClipboardOwner, поэтому, когда моя программа теряет право собственности на буфер обмена (это означает, что другой процесс изменил буфер обмена), в моей программе запускается событие, позволяющее мне прочитать изменения.

public class OwnershipClipboardListener extends Thread implements ClipboardOwner
{
    private Clipboard clipB = Toolkit.getDefaultToolkit().getSystemClipboard();

    public void run()
    {
        /* Initialize ClipboardListener and gain ownership of clipboard */
    }

    @Override
    public void lostOwnership(Clipboard clipboard, Transferable transferable)
    {
        /* Auto-fired when I lose Clipboard ownership.
           Can do processing and regaining ownership here */
    }    
}

Проблема в том, что при работе в OSX любые изменения в буфере обмена отражаются, только если я вручную нажму Cmd-Tab на значок запущенного процесса в доке. Поэтому, если перед тем, как я переключусь на значок в доке, будет выполнено несколько операций с буфером обмена, только последняя из них будет иметь какой-либо эффект. Я не сталкиваюсь с этой проблемой в Linux или Windows.

Это похоже на то, что поток переходит в спящий режим, когда программа теряет фокус, но последний триггер события все еще срабатывает, когда он просыпается. Можно ли как-то предотвратить этот сон?


  • Публикует это и это кажется имеют аналогичные проблемы, но по большей части их буфер обмена был обходным путем для выполнения некоторой передачи данных. Мне на самом деле нужно все время читать буфер обмена. 06.04.2012

Ответы:


1

Я подозреваю, что OSX не предоставляет уведомления об изменениях буфера обмена, поэтому Java делает все возможное, уведомляя вас всякий раз, когда он просыпается по какой-либо другой причине.

Мое подозрение исходит из NSPasteboard, в частности подпрограмма changeCount. В нем говорится: «Поэтому вы можете записать количество изменений в то время, когда вы станете владельцем монтажного стола, а затем сравнить его со значением, возвращаемым из changeCount, чтобы определить, владеете ли вы все еще». Нет упоминания об использовании события для обнаружения изменений.

06.04.2012
  • Но в этом случае метод lostOwnership() действительно запускается, за исключением того, что это происходит только тогда, когда я переключаю фокус на приложение Java. В других системах событие запускается даже в фоновом режиме. 09.04.2012
  • Я имею в виду, что ОС не информирует JVM о том, что произошло изменение. JVM, по-видимому, проверяет changeCount для вас, но только когда он получает несколько циклов, например, когда одно из его окон получает фокус. 09.04.2012

  • 2

    Кажется, Кит прав. Однако вы можете найти обходной путь, отправив приложение в фоновый режим (на *Nix):

    java -jar clipboard-1.0.jar &
    

    Это открывает приложение Java в фоновом режиме и не требует фокуса окна для запуска уведомлений.

    11.04.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..