Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

QProcess: память и время

#qt #cpp


Имеется цикл, перебирающий тучу строк (более 100000). Для каждой строки вызывается
функция:
for (QList::iterator i = list.begin(); i != list.end(); ++i)
    Checker::CheckIt((*i));

Checker::CheckIt(QString str) 
{
    check.start("addToCheckList " + str);
    check.waitForFinished();
    check.close();
    check.kill();
}

Занимает эта операции таки не мало времени, несколько минут.
Каким образом лучше реализовать подобное и как можно ускорить процесс обработки?
Создовать новый объект для каждой команды QProcess command = new QProcess();? Тогда
как его удалять из памяти после завершения?    


Ответы

Ответ 1



Обязательно нужен QProcess? Если нет, то можно через QThread. Например, "разбить" общий контейнер на куски, заданные начальным и конечным итератором. Создать свои объекты-наследники QThread, куда передавать итераторы начала и конца. class MyProc : public QThread { ... MyProc(QList::ConstIterator from, QList::ConstIterator to); virtual void run() { for(QList::ConstIterator it = m_from; it != m_to; ++it) { Checker::CheckIt(*it); } } }; Вызвать можно примерно так: int part = list.size()/num_of_processes; if(list.size()%num_of_processes>0) part += 1; for(QList::ConstIterator it = list.begin(); it != list.end(); (it + (part+1) < list.end())? (it+=(part+1)) : (it=list.end()) ) { QList::ConstIterator it2 = (it + (part+1) < list.end())? (it+(part+1)) : (list.end()); MyProc *myproc = new MyProc(it,it2); myproc->start(); } В этом наброске конечный итератор to - "не включительный", т.е. следующий за конечным. В лучшем случае это даст ускорение в количество раз, равное количеству процессоров.

Ответ 2



Удалять из памяти по завершению процесса лучше всего так: QProcess* proc = new QProcess(); connect(proc, SIGNAL(finished(int)), proc, SLOT(deleteLater())); Такое удаление будет безопасным, и произойдет только когда процесс полностью завершится. При этом вы не забудете очистить память - так как код очистки сразу следует за созданием процесса.

Комментариев нет:

Отправить комментарий