Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Qual a melhor maneira de prevenir que uma janela trave (congele) as outras?
Eu tentei mover o QMainWindow para um QThread (QMainWindow::moveToThread), mas isso não é possível mover o QWidgets.
O motivo disso é que eu preciso separar os QWebPage/QWebView em processos/Threads diferentes para evitar que um script em uma página congele todas as janelas (por exemplo um javascript com loop infinito), no caso só travaria a janela com a página que está o script as demais janelas continuariam normalmente.
Como eu posso fazer isso?
class myWebPage : public QWebPage {
QWebPage * createWindow(QWebPage::WebWindowType type) {
Q_UNUSED(type);
QMainWindow *wx = new mBROWSERQT(NULL,true);
QWebView *wv = wx->findChild<QWebView*>("mybrowsertest");
wx->showNormal();
return wv->page();
}
};
...
ui->mybrowsertest->setPage(new myWebPage());@_Isis_ Obrigado pela rápida resposta.
Aparentemente QFuture::run foi o que funcionou melhor, mas eu ainda estou com uma dificuldade. Ao passar o QWebpage para o createWindow, as outras janelas ainda podem travar.
Eu gostaria de saber se tem como reimplementar o QWebpage::createWindow (ou QWebView::createWindow) com QFuture?
Nota: Não precisa ser exatamente a janela que tem que rodar em outro "processo", seria apenas o QWebPage/QWebFrame
Grato mais uma vez.
Olha, não sei se tem um jeito "limpo" de fazer isso.
Obrigado pela rápida resposta
Olha, não sei se tem um jeito "limpo" de fazer isso.
infelizmente mover QWidgets não é possivel, eu queria algo equivalente, não necessáriamente isso.
http://qt-project.org/forums/viewthread/6425
Aqui está falando de "download da página" não de "execução".
Infelizmente nenhum destes links me foi útil, pois não se tratam exatamente do meu problema.
Grato mesmo assim. Se tiver alguma ideia eu ficaria agradecido. Vou tentando aqui fazer alguns testes.
No momento eu desativei o QWebPage::createWindow e estou tentando usar somente QWebPage::acceptNavigationRequest com QFuture::run, o problema será compartilhar os target= e window.oppener, já que estarão em processos diferentes (não criados pelos QWebPage::createWindow)
Já tentou usar o QtConcurrent?
http://www.codeprogress.com/cpp/libraries/qt/QTConcurrentAvoidGUIFreezing.php#.UZWY8LW1GSo
http://doc.qt.digia.com/qq/qq27-responsive-guis.html
O estranho é que existe um post de 2010 no qual diz-se p/ usar o moveToThread p/ a QThread: http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/
E a réplica desse post: http://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html