#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())); Такое удаление будет безопасным, и произойдет только когда процесс полностью завершится. При этом вы не забудете очистить память - так как код очистки сразу следует за созданием процесса.
Комментариев нет:
Отправить комментарий