Есть объект класса QNetworkReply. Есть слот (в каком-то другом объекте), связанный с его сигналом finished (). Сигналы синхронные (по умолчанию). Есть только один поток.
В какой-то момент я хочу избавиться от обоих объектов. Больше никаких сигналов или чего-либо от них. Я хочу, чтобы они ушли. Ну подумал, воспользуюсь
delete obj1; delete obj2;
А можно? Спецификации для ~ QObject говорят:
Удаление QObject во время ожидания доставки ожидающих событий может вызвать сбой.
Что такое «ожидающие события»?
Может ли это означать, что пока я вызываю свое delete
, уже есть некоторые «ожидающие события», которые нужно доставить, и что они могут вызвать сбой, и я не могу действительно проверить, есть ли они?
Итак допустим, я звоню:
obj1->deleteLater(); obj2->deleteLater();
На всякий случай.
Но действительно ли я в безопасности? deleteLater
добавляет событие, которое будет обработано в основном цикле, когда туда попадет управление. Могут ли уже быть какие-то ожидающие события (сигналы) для obj1
или obj2
, ожидающие обработки в основном цикле , прежде чем deleteLater будет обработан? Это было бы очень прискорбно. Я не хочу писать код, проверяющий статус «несколько удален» и игнорирующий входящий сигнал во всех моих слотах.
Я вижу, что существует ряд доступных скриптов, некоторые из которых являются интерпретаторами, но среди компиляторов RemObjects pascal script и Delphi Web Script (DWS) кажутся мощными и активно разрабатываются.
Кто-нибудь может предложить преимущества одного перед другим? m, используя модифицированную версию рабочего процесса «В конечном итоге» из спецификации F # для моей разработки на Xbox. Похоже, что платформа .net на Xbox не поддерживает хвостовые вызовы. Из-за этого я должен ...
Я использую модифицированную версию рабочего процесса «В конечном итоге» из спецификации F # для разработки на Xbox. Похоже, что платформа .net на Xbox не поддерживает хвостовые вызовы. Из-за этого я должен отключить оптимизацию хвостового вызова при компиляции.
Хотя сначала может показаться, что это ограничение предотвратит использование любой формы цикла в вычислительных выражениях, я изначально думал, что «пошаговое выполнение» позволит избежать этой проблемы. : Рекурсивная функция f в вычислительном выражении не вызывает себя напрямую, вместо этого она возвращает значение Eventually, содержащее лямбду, которая вызывает f.bind @ 17-1 ", код которого показан ниже. Номер строки, отображаемый в трассировке стека, - это строка 17.
let rec bind k e =
match e with
| Completed r ->
Running(fun () -> k r)
| Running f ->
Running(fun () -> f() |> bind k) // line 17
| Blocked(dt, f) ->
Blocked(dt, fun () -> f() |> bind k)
| BlockedNextFrame f ->
BlockedNextFrame(fun () -> f() |> bind k)
| Yield f ->
Yield(fun () -> f() |> bind k)
В чем я ошибаюсь? Мои рассуждения о том, что" пошаговая рекурсия "безвредна при переполнении стека, неверны? что-то не так с моей реализацией связывания?
Ой! Продолжение перехода с рекурсией вызывает у меня головную боль ...
РЕДАКТИРОВАТЬ: «Пошаговая рекурсия, безвредная при переполнении стека» получила название, я только что узнал. Это называется батут.