LINUX.ORG.RU

Запуск слота только один раз

 


0

1

Есть такая конструкция. Реализован класс-обертка для QFtp. При создания объекта этого класса я дергаю у него метод openConnection(), который пытается подключиться к ftp серверу и отправляет сигнал sigConnectResult(bool) с результатом подключения. Проблема следующая. sigConnectResult(bool) соединен со слотом, который меняет флаг isOnline и запускает загрузку файлов на сервер. Перед загрузкой мне необходимо только один раз скачать файл с этого ftp сервера, т.е. только при запуске программы и успешном подключении, последующие подключения этого класса-обертки к серверу надо игнорировать. Для этого я хочу добавить еще слот, который соединю с sigConnectResult(bool), а внутри него вызову

disconnect(this->uploader, SIGNAL(sigConnectResult(bool)), this, SLOT([этот_слот_который_хочу_реализовать]))
, чтобы он отработал один раз, отсоединился и больше сигнал не получал. Будет ли это правильной реализацией, или можно сделать это как-то иначе?

★★★★
Ответ на: комментарий от WRG

Тогда создай объект, прикрути его к connected() и пускай удаляет сам себя после зугрузки.

nanoolinux ★★★★
()
Ответ на: комментарий от WRG

Мне же надо только после первого подключения к серверу.

а зачем тогда слот? вызови просто как обычный метод.

Deleted
()
Ответ на: комментарий от Deleted

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

WRG ★★★★
() автор топика
Ответ на: комментарий от MikeDM

Имеешь в виду создать отдельный флаг, и как только интересующий меня метод отработает выставить его, и ориентируясь на него, просто выходить из метода при повторном вызове?

WRG ★★★★
() автор топика
Ответ на: комментарий от WRG

так эта ... соединение с сервером оно как бы идеологически только одно на сессию работы, нет? Ну допустим соединил, получил, потом обрыв, опять будешь соединять?. не разумлю твою идею.

anonymous
()
Ответ на: комментарий от anonymous

Да, в случае обрыва соединение переустанавливается, а вот повторно скачивать этот фвйлик не требуется.

WRG ★★★★
() автор топика

Кстати, я не вкурсе про Qt, но что там будет, если объект, которые соединен своим слотом с сигналом просто сдохнет? Если «это нормально», ну так и прибей его прям там же или сделай чтоб он сам сдох.

anonymous
()
Ответ на: комментарий от WRG

QMetaObject::invokeMethod это как раз старое, когда можно вызвать слот без коннекта, указав всяческие параметры, тип и т.п. Это конечно если ты не хочешь просто вызвать метод по какой-то причине.

invokeMethod это то что тебе надо

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

В invokeMethod можно вызывать метод не только непосредственно в месте вызова, но и поставив в очередь с опцией Qt::QueuedConnection. Я использую в основном для этой фичи, чтобы не плодить таймеры.

grondek
()
Ответ на: комментарий от WRG

ну или в самом методе выполнять disconnect от этого слота. костыльно правда это.

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

пожалуй сделаю так. а то мне что-то самому не нравится моя идея с дисконнектом внутри слота. кривовато как-то смотреться будет.

WRG ★★★★
() автор топика
Последнее исправление: WRG (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

При чем тут deleteLater() и вызовы методов класса в другом потоке?

grondek
()
Ответ на: комментарий от WRG

Используй мьютексы. Проверяем переменную - не выставлена - блокируем мьютекс и качаем. Заблокирован мьютекс - валим. Выставлена - тем более валим.

RiseOfDeath ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.