Nano Hash - криптовалюты, майнинг, программирование

Как получить отзыв пользователя от QThread::run(), например. QMessageBox?

Я знаю, что запускать какой-либо виджет с графическим интерфейсом из отдельного потока — это плохо. Для только сообщений это можно преодолеть с помощью сигналов в основной поток. Но что, если потоку требуется пользовательский ввод, как можно передать ответ потоку и как этот поток может ждать этого ответа?

Мой конкретный случай — это приложение, использующее sftp из libssh. Во время подключения и аутентификации пользователю может потребоваться ответить на один или несколько вопросов. Но из соображений производительности все SSH/SFTP должны выполняться в отдельном потоке.

24.06.2012

  • По какой причине вы не можете получить учетные данные пользователя перед запуском потока? 24.06.2012
  • Для простой аутентификации по паролю этого было бы достаточно, но аутентификация SSH может быть интерактивной, то есть сервер задает вам вопросы, вы даете ответы, а сервер может снова задавать новые вопросы и т. д. 24.06.2012

Ответы:


1

Вообще невозможно использовать классы GUI в потоках, отличных от GUI. Что вы можете сделать, так это использовать сигналы и слоты для обмена информацией из одного потока в другой. Отправьте сигнал из вашего рабочего потока и ждите семафора, например QWaitCondition. Отправьте сообщение с ответом.

В вашем случае вы также можете использовать Qt::BlockingQueuedConnection в качестве типа подключения, чтобы остановить рабочий поток, пока пользователь не введет данные. QInputDialog также ждет, пока пользователь закончит ввод данных.

24.06.2012
  • Если вы отправляете сигнал из рабочего потока, зачем вам ждать семафор?! QObject в рабочем потоке может получить ответ в своем собственном слоте. Соответствующий тип подключения будет использоваться Qt по умолчанию. 25.06.2012
  • Вопрос задан четко, как рабочий поток может ждать ответа. Так что я предположил, что это было точкой. Если нет необходимости вручную останавливать процедуру, то опять же, как я сказал во втором предложении, сигналы и слоты можно использовать для обмена информацией: отправить сообщение с ответом. Но спрашивающий, похоже, уже знал это, так что я мог неправильно понять вопрос. 25.06.2012
  • Явное ожидание совершенно не нужно. Ожидание мьютекса — это то, что уже делает цикл обработки событий. QObject, независимо от того, перемещен ли он в поток без графического интерфейса или нет, большую часть времени ожидает: на самом деле, все это время он не выполняет никакого кода. Ожидание ответа присуще. Ответ просто приходит как сигнал, подключенный к слоту в QObject. Использование классов графического интерфейса в потоках, отличных от графического интерфейса пользователя, осуществляется просто путем отправки сигналов виджетам. Вы можете отправить искусственный сигнал из одной строки кода, например: чтобы установить текст на QLabel, вы можете сделать QMetaObject::invokeMethod(label, "setText", Q_ARG(QString, "foo")); 25.06.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..