Выполнение SwingWorker в ближайшем будущем - PullRequest
2 голосов
/ 26 января 2012

В clojure вы можете создать прокси SwingWorker, реализовать doInBackground и методы do.Как бы вы продолжили вызывать метод execute из swworkworker?

1 Ответ

2 голосов
/ 29 января 2012

Вы можете создавать и вызывать SwingWorker с помощью стандартного взаимодействия Java, например:

;; define a proxy that extends SwingWorker
(def my-swing-worker 
  (proxy [SwingWorker] []
    (doInBackground []
      (reduce + (range 1000000)))))

;; run the SwingWorker
(.execute my-swing-worker)

;; Get the result
(.get my-swing-worker)
=> 499999500000

Однако обычно в Clojure вы не используете SwingWorkers напрямую.В Clojure уже есть функция, которая обеспечивает функциональность SwingWorker: future использует отдельный поток для вычисления долгосрочной задачи и позволяет получить результат позже.Пример использования:

;; define and launch a future
(def my-future 
  (future 
    (reduce + (range 1000000))))

;; get the result (will wait for future to complete if needed)
@my-future
=> 499999500000

Я думаю, что большинство людей согласятся с тем, что «чистый Clojure» проще и более идиоматичен для выполнения фоновых задач.Единственная причина, по которой я предпочитаю отдавать предпочтение SwingWorker, заключается в том, что вы используете некоторые из специальных функций интеграции графического интерфейса, которые он предоставляет (например, возможность вызывать события изменения свойств).

...