Alexander
ну сначала проверить зажевываются ли
Alexander
вообще странно если это сгенерированное сервантом код то не должны
Kirill
И как их отловить, если они зажевываются?
яб форснул явно шаги для начала, через evaluate
Kirill
у серванта тоже есть тикет про ленивость, для сервера правда
Alexander
ClientM это ExceptT IO
Kirill
ну Handler тоже
Alexander
если оно там все сверхленивое, то и deleteMessages незачем выполняться
Alexander
хотя у меня нигде подобное поведение не наблюдается
саша
а зачем вообще существует ленивое IO?
Alexander
итеративность бесплатно
Kirill
lazy IO тут вроде непричём
Alexander
но поведение выше это не ленивое IO
Alexander
ленивое IO это readFile
Alexander
например
Alexander
когда ты получаешь на выходе "строку" а по факту читаешь файл по надобности
Kirill
ленивую "строку"
Alexander
да
Maxim
слушайте, а если я вызываю FFI функцию, которая внутри запускает свой event loop и управление назад в хаскель не отдает, ее можно как-то прибить асинхронным исключением из другого потока?
Андрей
можно знаешь что?
Alexander
@maksbotan есть interruptible
Maxim
что interruptible?
Alexander
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ffi-chap.html#interruptible-foreign-calls
Alexander
посмотри как это там сделано
Alexander
вообще чаще у event_loop есть свой API
Maxim
ну у меня такой код withAsync foo $ \t -> link t runUI
Maxim
хочется, чтобы когда foo кидал исключение, runUI бы умирал
Maxim
для этого я вписал link
Maxim
но не работает, потому что runUI вызывает FFI, из которого нет возврата
Maxim
можно запустить свой хендлер, который вызовет exit евент лупа если foo сдох...
Maxim
что лучше, это или сделать interruptible?
Alexander
зависит от того, что там в runUI
Maxim
QCoreApplication.exec там
Maxim
после всяких настроек
Alexander
я ну буду читать их свойства, я не знаю как оно будет реагировать на сигнал
Alexander
если умирать, то interruptible - ok
Maxim
поэкспериментирую
a66ath
QCoreApplication.exec там
Какие-то свежие биндинги?
Maxim
qtah
Maxim
не свежий, давно уже вроде
Cheese
qtah отлично работает, только сырой
Cheese
QCoreApplication.exec надо прерывать соответствующими ему способами. qApp->exit или как там его
a66ath
не свежий, давно уже вроде
>Fri Sep 7 вроде свежий
Maxim
ну это последняя версия
Alexander
я просто не знаю, что там есть, чего нету
Maxim
ну там есть
Maxim
но надо думать как прокинуть все куда надо...
Cheese
причём QCoreApplication.exit можно вызывать из любой нити, если я правильно помню. но лучше доку проверить
Alexander
было бы странно если не из любой
Alexander
т.к. у тебя после runUI нету контроля
Maxim
ну предполагается, что ты вызовешь его в главном треде по клику кнопки, например
Cheese
было бы странно если не из любой
Qt построен вокруг идеи, что весь GUI работает в главном треде, а для сложной работы запускай воркеров сам
Alexander
ну кроме как из других ты не можешь вызвать ниоткуда .exit()
Cheese
т.к. у тебя после runUI нету контроля
Qt писали одни люди, runUI другие, нельзя быть уверенным, что они друг друга правильно поняли
Alexander
+
Cheese
ну кроме как из других ты не можешь вызвать ниоткуда .exit()
почему же? из хэндлеров внутри exec можно
Alexander
ок, принято
Cheese
нефиг гадать, надо почитать доки. а в них не сказано, что thread-safe, значит, лучше не вызывать exit напрямую. более того, сказано, что лучше вызывать exit как слот по сигналу через QueuedConnection, таким образом гарантируется передача управления в нужную нить и корректное завешение других сигналов
Maxim
ну вот этого я вряд ли могу добиться
Maxim
(доки читал)
Maxim
в части queued connection
Cheese
в части queued connection
а в чём проблема?
Maxim
ну так чтобы сделать connection, нужен сигнал
Cheese
не можешь вызвать connect?
Maxim
а мне надо по эксепшену убить, а не по сигналу
Cheese
ну, есть хак без сигнала
Cheese
QMetaObject::invokeMethod(app, "quit", Qt::QueuedConnection);
Cheese
QMetaObject::invokeMethod(app, "quit", Qt::QueuedConnection);
простите, не знаю, как это на Хаскеле выглядит
Maxim
осталось посмотреть, есть ли QMO в кутахе :)
Cheese
и добавить, если нет
Alexander
а мне надо по эксепшену убить, а не по сигналу
так в хэдлере эксепшена сигнал слать
Maxim
(я в сентябре туда еще один пр пропихнул)
Alexander
т.е. делаешь тред с exception handler и в finally прибиваешь тред
Alexander
например: lock <- newEmptyMVar () race (runUI) (takeMVar lock `finally` sendSignal)
a66ath
@qnikst есть где норм гайд по new командам кабала?
Alexander
на read-the-docs
Alexander
https://cabal.readthedocs.io/en/latest/
a66ath
Спасибо