LINUX.ORG.RU

qt нужен совет

 ,


1

2

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

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

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

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

Та гиста точно работать не будет с виндой.

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

Чтож все ее так ненавидят?) ок

Потому что QTreeWidget, QListWidget, QTableWidget и некоторые другие, это просто «демо-виджеты», не предназначенные для серьёзных приложений, где число элементов превышает сотню.

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

Изначально эти игрушки кажутся хорошей идеей. Мол, а что, готово же уже. А потом ты начинаешь этим пользоваться…

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

Ну если бы они написали нормальный event loop как в бусте, можно было бы и не превращать. А так только костыли, только хардкор, в угоду кроссплатформе.

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

Возможно, там сложнее устроить себе падение программы. А на глюки внимания не обращают. Вот элементарный пример:

Resource * r;

void onEvent() {
    r = new Resource();

    for(int i = 0; i < 1000000; ++i) {
        processMessages();
        r->doSomething();
    }

    delete r;
}

Возможна такая цепочка вызовов: eventLoop -> onEvent -> processMessages -> onEvent

В результате которой r, над которой работал обработчик onEvent, окажется подменённым вторым onEvent, и при возвращении из processMessages будет указывать на удалённый объект.

unC0Rr ★★★★★
()

Тащемта после нажатия кнопки на форме, в соседнем треде вызывается следующий сокет:

void nonGui::waitingForRes(){
    struct sockaddr_in addr;
    listener = socket(AF_INET,SOCK_STREAM,0);
    if (listener < 0){
        perror("result socket");
        exit(2);
    }
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3427); 
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
      {
        perror("bind at gui");
        exit(2);
      }
      listen(listener, 1);
      sock=accept(listener,NULL,NULL);
      if (sock<0) {
            perror("accept");
            exit(3);
      }
      m_notifier=new QSocketNotifier(listener,QSocketNotifier::Read);
      connect(m_notifier,SIGNAL(activated(int)),this,SLOT(gettingResults()));
}
Ну и в итоге клиент коннектиться успешно, отправляет данные, а нотифер и виду не подает, я уж не знаю куда смотреть.
В чем же может быть дело?

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

QCoreApplication::eventDispatcher()->registerSocketNotifier(m_notifier);

А вообще если уж за сокеты взялся, то в Qt уже всё есть готовое в виде QTcpSocket/QTcpServer.

Dendy ★★★★★
()

гуглить: qt многопоточность

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

Ну, если очень захотеть, то можно и звёзды. Тоже можно сказать и про потоки.

Банальный shared ptr конкретно эту проблему решает.

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

А другие не решает. Да и конкретно эту не решает. Логика может поломаться, когда посреди цикла вдруг объект заменится другим объектом. А вообще, дело в том, что это довольно неочевидный эффект от использования processMessages. Тем более для новичков, которые скорее всего и будут использовать такой костыль.

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

Эффект как раз очевиден. И назначение описанно в документации.

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

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