LINUX.ORG.RU

QWebPage и синхронизация

 ,


0

1

QWebPage renderer;

    QMutex xlock;

В конструкторе:

connect(&renderer,SIGNAL(loadFinished(bool)),this,SLOT(saveRender(bool)));

Далее я прохожусь по списку урлов которые хочу сохранить:


  for(int r=0;r<model->rowCount();r++)
    {


        xlock.lock();
        QSqlRecord sql = model->record(r);


        target_urle=sql.value("url").toString();


        renderer.mainFrame()->load(QUrl(target_urle));

    }

Функция сохранения:

void MainWindow::saveRender(bool x)
{
    ...
    result.save(render_path);

    xlock.unlock();
}



Как правильно сделать чтобы это не висло и не падало при переборе из нескольких ссылок.

Как я понял, при загрузке страницы создаётся thread`а из которой потом эмитируется сигнал loadaFinished. За это время цикл достаёт следующую ссылку и происходит конфликт когда по сути выполняется сохранение результата и загрузка след. страницы. Как правльно расставить объекты синхронизации?

★★★

Что происходит так это то, что у тебя виснет на второй итерации цикла потому, что не может получить lock, тред блокируется (включая Qt'шые события и слото-сигнальную систему) и твой saveRender никогда не исполняется, unlock не происходит.

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

Это я уже понял когда убрал локи и расставил qDebug()<<QThread::currentThreadId();;

и увидел что слот вызывалется в том же потоке.

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

и что же в этом такого, если не секрет?

Прости, я не могу выразить это словами. Я интуитивно понимаю, что это никуда не годится :3

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

локи были попыткой понять как зделать так чтобы после вызова load(url) был saveResult а потом только новый load(url). Но к сожалению loadFinished явно приходит из потока который создал qwebpage на load(). Поэтому толком сохранить ничего не получается.

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

Я бы сделал очередь с урлами.
В конце слота для сохранения извещать, что можно брать следующий элемент из очереди.

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

есть ещё вариант создать класс qthread с со своими рендерами и сохранялками и стартовать пачку потоков из цикла

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

Можно и с потоками, только будь осторожен, большинство людей не осиливают многопоточность.

создать класс qthread

И это еще, вот тебе чтиво на эту тему:
http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/
http://blog.qt.digia.com/blog/2006/12/04/threading-without-the-headache/

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