LINUX.ORG.RU

GUI не перерисовывается в процессе выполнения цикла

 , ,


0

1

Есть список серверов. В таблице. Прохожу циклом по таблице и последовательно коннекчусь к каждому серверу. После коннекта проверяю, есть интернет или нет (curl). Если курл вернул ip адрес, то в соответствующую строку таблицы добавляю этот ip. Код работает, выхлоп qDebug в консольку идет, и в таблицу тоже добавляется, но таблица перерисовывается только когда цикл закончится. В списке порядка 100 локаций, и пройтись по всем занимает около 10 минут. Всё это время окно программы не реагирует ни на что. Как его разморозить, чтобы изменения в таблице отображались в процессе прохождения цикла, а не после его окончания?

Пробовал в отдельном QThread - не помогает,

QStringList vArguments;
    vArguments << "connect.sh";
    QStringList curlArguments;
    curlArguments << "--connect-timeout" << "5" << "ifconfig.me" ;

    QString stdout, ipAddr;
    QBrush brush;
    brush = QBrush(Qt::green, Qt::SolidPattern);
    QRegularExpression ipRegex(R"((\d{1,3}\.){3}\d{1,3})");
    QTableWidgetItem* item;

    bCancelSearch = false;

    for ( int i=0; i<table->rowCount()-1; i++ ){
        //поочередно коннект к серверам через скрипт connect.sh
        QTableWidgetItem *item = table->item(i,0);
        qDebug() << item->text();
        vArguments << item->text();
        vProcess = new QProcess();
        vProcess->setProcessChannelMode(QProcess::MergedChannels);
        vProcess->start( "sudo", vArguments );
        vProcess->waitForFinished();
        vArguments.removeLast();

        //после коннекта проверка наличия инета : curl ifconfig.me
        curlProcess = new QProcess();
        curlProcess->setProcessChannelMode(QProcess::MergedChannels);
        curlProcess->start( "curl", curlArguments );
        curlProcess->waitForFinished();

        stdout = curlProcess->readAllStandardOutput();

        //если curl вернул ip - добаляю его в таблицу
        item = table->item(i,2);
        if ( ipRegex.match(stdout).hasMatch() ){
            int lastPos = stdout.lastIndexOf(QChar('\n'));
            ipAddr = stdout.mid(lastPos+1);
            qDebug() << item->text() << "responded" << ipAddr;
            txtOutput->append(item->text() + " has responded from " + ipAddr);
            item = new QTableWidgetItem();
            item->setText(ipAddr);
            table->setItem(i,4,item);
            for (int j=0; j<5; j++){
                item = table->item(i,j);
                item->setBackground(brush);
            }
            }else{
                qDebug() << "no match" << item->text();
                txtOutput->append(item->text() + " no response");
            }
            if ( bCancelSearch )return;
    }

Как разморозить гуй?

★★★★★

Последнее исправление: hobbit (всего исправлений: 1)

Надо в отдельном потоке это выполнять. Или использовать асинхронный ввод-вывод.

vbr ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

потокобезопасно если connect сделать после moveToThread либо указать явно

Да не надо в 99,(9)% случаев явно указывать тип соединения! При использовании AutoConnect (то есть всегда, когда тип соединения опущен) тип соединения определяется в момент бросания сигнала:

If the receiver lives in the thread that emits the signal, Qt::DirectConnection is used. Otherwise, Qt::QueuedConnection is used. The connection type is determined when the signal is emitted.

И не важно, было оно соединено до перемещения в другой поток или после

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

Я предпочитаю указывать явно всегда. От этого из контекста кода уже понятнее становится

И создаёшь себе проблемы, когда спустя какое-то время решаешь разнести по потокам или же наоборот, переместить в один, а тип соединения гарантированно где-нибудь забудешь.


P.S.: Сам как?

Болею

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

И создаёшь себе проблемы, когда спустя какое-то время решаешь разнести по потокам или же наоборот, переместить в один, а тип соединения гарантированно где-нибудь забудешь.

Ну, оно же архитектурно понятно. А даже если что-то перемещаешь куда-то, переделываешь - роадмап есть. Так что врядли забуду, если никто не торопит ))

Болею

Выздоравливай. У меня вроде все стабильно.

deep-purple ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.