Russian Qt Forum
Май 03, 2024, 20:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: GUI<<->Console обмен сообщениями и данными.  (Прочитано 20535 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #30 : Август 05, 2015, 08:08 »

Для асинхронного чтения stdin нужно использовать QSocketNotifier. Выдернул из рабочего проекта:
Код
C++ (Qt)
CommandServer::CommandServer(const CComPtr<IBackupRestoreClient>& backupRestoreClient)
       : m_backupRestoreClient(backupRestoreClient)
         , m_stdinNotifier(new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, this))
         , m_stdout(new QTextStream(stdout))
         , m_commandHandlersFactory(new CommandHandlersFactory(m_backupRestoreClient))
{
       connect(m_stdinNotifier.data(), &QSocketNotifier::activated, this, &CommandServer::readInputCommands);
}
 

Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #31 : Август 05, 2015, 08:12 »

Для асинхронного чтения stdin нужно использовать QSocketNotifier. Выдернул из рабочего проекта:
У ТС консольная программа без Qt.
QSocketNotifier умеет отслеживать дескрипторы под вендой?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #32 : Август 05, 2015, 08:24 »

Для асинхронного чтения stdin нужно использовать QSocketNotifier. Выдернул из рабочего проекта:
У ТС консольная программа без Qt.
QSocketNotifier умеет отслеживать дескрипторы под вендой?
Не проверял, но, насколько я знаю, да.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #33 : Август 05, 2015, 08:32 »

Не проверял, но, насколько я знаю, да.
А вот я сомневаюсь. Улыбающийся
В linux через QSocketNotifier можно пулить любые дескрипторы, там все файл.
А вот в венде даже для последовательного порта, так сказать, свой API. Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #34 : Август 05, 2015, 08:35 »

Не буду спорить, ибо виндов нету под рукой. В любом случае, можно написать свой вариант для обеих ОС. Не думаю, что это займет много времени. Но сокеты тоже хороший вариант, ибо в любой момент можно программы разнести на разные копмы и все будет работать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #35 : Август 05, 2015, 08:46 »

Цитата: Пантер
Не проверял, но, насколько я знаю, да.

Нет. QSocketNotifier можно использовать только для posix-дескрипторов.
В винде это сработает только для сокетов (для которых использовались POSIX совместимые вызовы).

В иных случаях для винды нужно использовать QWinEventNotifier и/или приватный QWinOverlappedIoNotifier,
в зависимости от ситуации.
Записан

ArchLinux x86_64 / Win10 64 bit
MaxoBik
Гость
« Ответ #36 : Август 05, 2015, 11:58 »

Не проверял, но, насколько я знаю, да.
Нет, не умеет - я уже это все давно проверил.
QProcess в винде подменяет stdin,stdout,stderr на свои пайпы для приложения через стартовый данные процесса(STARTUPINFO), я хотел дернуть их оттуда, но как оказалось они анонимные и как следствия не асинхронные. А boost судя по всему передает туда named pipes со всеми вытекающими.
Крч. сделать асинхронный stdin в виндовс не тривиальная задача, в 8-ке появляются еще отдельные особенности.
Проще заменить stdin на named pipe в виндовс.
« Последнее редактирование: Август 05, 2015, 12:33 от MaxoBik » Записан
MaxoBik
Гость
« Ответ #37 : Август 06, 2015, 13:50 »

Оказывается что в QT5 они сделали named pipes(\5.4\Src\qtbase\src\corelib\io\qprocess_win.cpp), но как-то криво сделали - нет ни OVERLAPPED ни WaitForMultipleObjects нету.
Непонятно как это еще можно использовать в самой программе клиенте. К примеру я получил и достал оттуда хендл именнованого пайпа stdin:

Цитировать
STARTUPINFO startInfo;
HANDLE hStdInput;
....
GetStartupInfoW(&startInfo);
if( ( STARTF_USESTDHANDLES & startInfo.dwFlags ) == STARTF_USESTDHANDLES &&
     ( hStdInput=startInfo.hStdInput ) != INVALID_HANDLE_VALUE ){
     
   /// как его читать асинхронно здесь?
}

Но как его читать здесь без структуры OVERLAPPED? Ведь если не указать ее для ReadFile будет идти синхронное чтения.
Для Asynchronous I/O нужно ее указывать, но где ее взять?
« Последнее редактирование: Август 06, 2015, 13:52 от MaxoBik » Записан
Bepec
Гость
« Ответ #38 : Август 06, 2015, 13:59 »

Поэтому переделайте всё на сокеты и будет вам счастье на всех платформах и без подводных камней Веселый

PS причем переделывать то ничего особо и не надо, дернуть из примера пару функций и всё Улыбающийся
« Последнее редактирование: Август 06, 2015, 14:07 от Bepec » Записан
hydra13
Гость
« Ответ #39 : Август 20, 2015, 16:00 »

QSharedMemory
Записан
Bepec
Гость
« Ответ #40 : Август 20, 2015, 16:09 »

Есть только 2 способа нормально передавать данные - сокеты и пайпы. Пайпы в винде суровы, им обвязку писать и писать. А сокеты везде одинаковы.
Записан
MaxoBik
Гость
« Ответ #41 : Август 21, 2015, 22:09 »

QSharedMemory
Придется плясать с семафорами, да и не нужно это - мои данные почти полностью состоят из текста, которые нужно просто показать пользователя. Крч. я все сделал через пайпы с упаковкой данных в JSON. Именованые пайпы кстати в QT для Windows просто для вида, половина кода не реализована, пришлось писать с нуля.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 23.