LINUX.ORG.RU

qt нужен совет

 ,


1

2

Всем привет! Недавно начал изучать qt. При разработке приложения столкнулся со следующей задачей: в основную программу через некоторое время после нажатия кнопки через пайп скидывается текст, нужно его принять, распилить регулярками и закинуть в QTreeWidget. Kак лучше это реализовать, чтобы не висло главное окно?

Еще вместо кутишных регулярок можно использовать что-то по-быстрее, например сделать парсер на re2c (по сути те же регулярки, но compile time) или на каком-нибудь boost spirit

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

Если парсинг будет работать быстро может и не придется возиться с потоками

и про QTreeWidget забудь, используй модель

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

это просто «правило», «вынести GUI в поток» == «организовать функционал в отдельном потоке(ах)» - в любом случае GUI будет в отдельном thread'e

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

Да парсинг не долгий особо, там результаты nmap'a парсятся. А вот ожидание чего-то в пайпе у меня в цикле while(1){..}, оно и вешает гуиху) а чем виджеты плохи?

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

QRegularExpression internally uses a just in time compiler (JIT) to optimize the execution of the matching algorithm. The JIT makes extensive usage of self-modifying code, which can lead debugging tools such as Valgrind to crash. You must enable all checks for self-modifying code if you want to debug programs using QRegularExpression (f.i., see Valgrind's --smc-check command line option). The downside of enabling such checks is that your program will run considerably slower.

To avoid that, the JIT is disabled by default if you compile Qt in debug mode. It is possible to override the default and enable or disable the JIT usage (both in debug or release mode) by setting the QT_ENABLE_REGEXP_JIT environment variable to a non-zero or zero value respectively.

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

И что? C re2c все равно быстрее будет, особенно если регулярки сложные

annulen ★★★★★ ()

Люди вкратце готово или нет? Год уже спрашиваю хватит меня игнорировать. https://msdn.microsoft.com/en-us/library/dd492427.aspx Интересует в первую очередь относительно gcc конечно же.

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

Qt дал им сигналы/слоты - нет, хотим есть говно

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

Делай в этом цикле processEvents...

processEvents() нужен для интеграции Qt в чужой цикл событий, а здесь обратный случай.

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

Угу, и получи тыкву под виндой? Или там не select?

Под виндой туда передаётся не файловый дескриптор, а хендл объекта из WinAPI, на который приходят события. Да, там уже не select(), а WaitForMultipleObjects().

Dendy ★★★★★ ()
Последнее исправление: Dendy (всего исправлений: 2)
Ответ на: комментарий от Stil

не кроссплатформенно - на винде stdin не сокет.

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

Чет верится с трудом. Прям в Qt взяли и запилили проверку, что это за чиселко, и если чиселко это дескриптор сокета мы там заюзаем select а если чиселко это хэндл то iocp.

Не, если запилили молодцы, но пока глазом не увижу, не поверю :)

Есть какая нить онлайн компилялка с Qt под винду интересно?

Даже проверить захотелось. Но не на столько, что бы ставить винду или Qt на винду.

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

Бегло посмотрел сорцы, для сокетов точно используется select.

Свитча по тому когда используется WaitForMultipleObjectsEx, сходу - не понял.

Либо реально запилили проверку ху из ху, либо для таймерков и всяческих юзают его.

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

С тех пор как они наполовину поддерживают posix, а на половину халтурят. Хотя сокеты это вроде bsd ?

Я посмотрел первые попавшиеся сорцы, возможно, они тухлые...

Однако, когда я последний раз тыкал Qt (4.6) - под виндой не работал цикл сообщений на чём то кроме сокетов, по крайней мере на файлах - точно не работал, меня это сильно обломало.

pon4ik ★★★★★ ()

QtConcurrent, QFuture, etc

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

В том то и дело, что нет.

Так исторически сложилось, что нормальное socket api в винде вокруг дескрипторов бегает. Скорее всего есть и WinApi, но я ни разу нигде его не встречал, ну кроме их wsa расширений bsd.

А ещё есть криво реализованный posix, который, тоже умеет давать дескрипторы на файловые обьекты в частности. Но тут, ребяты имеют winapi и рекомендуют юзать его. А там хэндлы.

Не вдаваясь в различия между хэндлом и дескриптором, скажу, что штуки это - разные. А select под виндой умеет жрать только дескрипторы, и только от сокетов, от файлов и специальных устройств - не умеет.

Однако ребяты, разработали iocp api, которое умеет в хэндлы, и выглядит даже веселее чем select, фактически как epoll иже с ним.

Но все эти api разные, позикс так вообще без каких то шансов на event loop живёт, и различить от какого api чиселко, да ещё и с гарантией... Как это сделать - мне на вскидку не понятно. Ну если нет 5ого api...

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

Что тут происходит:D Если я правильно понял, то QSocketNotifier просто садиться на любой ф/д и вызывает слот если там что-то происходит, верно?

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

Краткая выжимка:

  • в linux и прочих уважающих стандарты - на любой fd, да.
  • в офтопике - только на сокеты
  • в 4.6 так точно было, я пробовал, с файлами и с пайпами процессов

Рекомендую, всё-таки не верить мне на слово, таки ночь на дворе, я мог что-то просмотреть, а digia могли что-то поправить в свежих версиях.

Напиши маленький тест. Просто для файла. Или, попроси скинуть анона его тест.

Наколенный способ - читать stdin блоками по n байт, остальное время пускать processEvents. Чуть получше - читать в отдельном потоке, и слать сигналы с пачками данных. Либо, если хочется красиво, сделать платформозависимую вставку отдельно для винды отдельно для всех остальных.

Как именно ожидать ввода по таймауту на стандартном входе под винду я к сожалению не знаю.

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

Рекомендую, всё-таки не верить мне на слово, таки ночь на дворе, я мог что-то просмотреть, а digia могли что-то поправить в свежих версиях.

Можно EXL спросить, он вроде много с виндой работает.

Как именно ожидать ввода по таймауту на стандартном входе под винду я к сожалению не знаю.

Немного наркотиков, и всё становится реально.

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

Дык у меня как раз таки и не винда, но собрать уже собрал - с stdin все работает как надо, попробую адаптировать под свою задачу, по идее пару костылей из велосипеда достану)

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

Собрал то - под винду?

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

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

Ну, тема не кроссплатформенная. В итоге с пайпом беда получается, ибо после записи в него, сигналы activated() летят бесконечно, что впринципе и логично.

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

считывается все и бесконечно читается последний символ
пайп после прочтения не должен закрываться, может в этом дело?

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

Короче покурил мануалы с сокетами и решил все переделать с ними, походу будет гораздо удобней.

celticw1 ()
Ответ на: комментарий от MuZHiK-2

Чтож все ее так ненавидят?) ок
Господа, появилась парочка вопросов:

  • Почему при отправке в сокет здоровой строки, отправляется только 8 байт?
  • На «сервере» настроил QSocketNotifier, приконектил слот, но он и не думает реагировать на приходящие пакеты, в чем может быть трабл?

Заранее спасибо!

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

Ты бы код показал, что ли (как отправки, так и приёма). Я подозреваю, что тебе просто сперва пришло 8 байт, а остальное прийти не успело

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