Вы можете использовать Label и установить AutoSize на true
.
Похоже, вы действительно получаете Clojure! хорошая работа :)
У переменных есть «корневое связывание», видимое во всех потоках, и каждый отдельный поток может изменять значение, которое он видит, не затрагивая другие потоки. Если я правильно понимаю, var не может существовать только в одном потоке без корневой привязки, которая видна всем, и ее нельзя "отсканировать", пока она не будет определена с помощью (def ...) в первый раз.
Ссылки фиксируются в конце транзакции (dosync ...), которая включает изменения, но только тогда, когда транзакция может завершиться в согласованном состоянии.
Вары не всегда имеют корневую привязку. Допустимо создавать переменную без привязки, используя
(def x)
или
(declare x)
Попытка оценить x до того, как он получит значение, приведет к
Var user/x is unbound.
[Thrown class java.lang.IllegalStateException]
Если вы хотите регистрировать неперехваченных исключений, просто используйте sys.excepthook .
Я не уверен, что вижу значение ведения журнала all вызвали исключения, так как многие библиотеки будут вызывать / перехватывать исключения для вещей, которые вам, вероятно, не нужны.
не возникло никаких исключений и ничто не вызвало повторную попытку транзакции. Я думаю, что deref
не имеет к этому никакого отношения, но, возможно, я неправильно понимаю вашу точку зрения. Я думаю ваш вывод об атомах неверен:
Атомы похожи на Vars, но с безопасностью совместного использования потоков, которая блокируется до тех пор, пока значение не изменится
Атомы изменяются с помощью swap!
или низкоуровневого с сравните и установите!
. Это никогда ничего не блокирует. swap!
работает как транзакция только с одной ссылкой:
Мартин прав, когда говорит, что операция Atoms перезапускается с 1. до тех пор, пока в конечном итоге не завершится успешно. Это также называется ожиданием вращения. {{ 1}} Хотя на самом деле блокируется блокировка, поток, выполнивший операцию, блокируется до тех пор, пока операция не завершится успешно, поэтому это операция блокировки, а не асинхронная операция.
Также в отношении Futures, Clojure 1.1 добавил абстракции для обещаний и Futures. Промис - это конструкция синхронизации, которая может использоваться для передачи значения из одного потока в другой. Пока значение не будет доставлено, любая попытка разыменования обещания будет заблокирована.
(def a-promise (promise))
(deliver a-promise :fred)
Фьючерсы представляют собой асинхронные вычисления. Это способ заставить код работать в другом потоке и получить результат.
(def f (future (some-sexp)))
(deref f) ; blocks the thread that derefs f until value is available