Russian Qt Forum

Разное => Объявления => Тема начата: serg_hd от Март 13, 2010, 19:46



Название: Утечка памяти, Qt Jambi.
Отправлено: serg_hd от Март 13, 2010, 19:46
Есть работа по Qt Jambi. Имеется утечка памяти для QWebView, надо устранить (средствами JNI, неважно чем).
Код в архиве.
Вознаграждение: начнём с $50.


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: BRE от Март 13, 2010, 20:06
Я не специалист в Java, но такой вопрос...
Я правильно понял работу программы?
Запускается основной поток, который периодически запускает новый поток ThreadCore.
Этот поток отсылает сигнал главному, при переключении на который, главный поток создает объект QWebView (в своем контексте) и запускает загрузку страницы.
Для чего нужен поток ThreadCore, если все созданные объекты QWebView работают в контексте главного потока (там где они и создавались)?


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: serg_hd от Март 13, 2010, 21:09
Я не специалист в Java, но такой вопрос...
Я правильно понял работу программы?
Запускается основной поток, который периодически запускает новый поток ThreadCore.
Этот поток отсылает сигнал главному, при переключении на который, главный поток создает объект QWebView (в своем контексте) и запускает загрузку страницы.
Для чего нужен поток ThreadCore, если все созданные объекты QWebView работают в контексте главного потока (там где они и создавались)?
На самом деле это очень урезанный вариант программы (оставил только самое базовое для простоты), в оригинальной во второстепенном потоке выполняются определённые операции, на основе которых и испускается сигнал на создание qwebview.


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: BRE от Март 13, 2010, 21:27
На самом деле это очень урезанный вариант программы (оставил только самое базовое для простоты), в оригинальной во второстепенном потоке выполняются определённые операции, на основе которых и испускается сигнал на создание qwebview.
Если все равно QWebView создаются и работают в основном потоке, для чего его настройка и финиширование обрабатывает объек ThreadCore.
Логичней если это будет происходить в слотах главного потока.



Название: Re: Утечка памяти, Qt Jambi.
Отправлено: serg_hd от Март 13, 2010, 21:35
На самом деле это очень урезанный вариант программы (оставил только самое базовое для простоты), в оригинальной во второстепенном потоке выполняются определённые операции, на основе которых и испускается сигнал на создание qwebview.
Если все равно QWebView создаются и работают в основном потоке, для чего его настройка и финиширование обрабатывает объек ThreadCore.
Логичней если это будет происходить в слотах главного потока.
Потому что эти операции не должны становиться в очередь, а работать асинхронно.

Если все равно QWebView создаются и работают в основном потоке,
Не работают, а только создаются, загрузка контента в qwebview, как известно, асинхронна, на основной поток не влияет. А создаётся объект именно в гуи-потоке, т.к. во второстепенном его создание невозможно, зато возможно во второстепенном (т.е. асинхронно) произвести все нужные расчёты перед запросом создания qwebview в главном потоке.


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: BRE от Март 13, 2010, 21:41
Потому что эти операции не должны становиться в очередь, а работать асинхронно.
Все QWebView работают в главном потоке, не в ThreadCore!
К моменту создания и начала загрузки QWebView, ThreadCore поток уже остановлен.
Для чего его объект должен ждать сигнал finished от QWebView?


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: serg_hd от Март 13, 2010, 21:44
К моменту создания и начала загрузки QWebView, ThreadCore поток уже остановлен.
Это само собой. Или вы знаете как закинуть qwebview именно во второстепенный поток пока он жив?)
Для чего его объект должен ждать сигнал finished от QWebView?
Чтобы продолжить работу с qwebview. Операции очень мелкие, поэтому на главный поток почти не влияют. И удобно работать всё же, когда эти все операции именно в другом классе.


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: BRE от Март 13, 2010, 21:57
Чтобы продолжить работу с qwebview. Операции очень мелкие, поэтому на главный поток почти не влияют.
Не знаю как в java происходит сборка мусора... А точно java не разрушает объект ThreadCore, до того как этот объект получает finished.
Я тебе и советую попробовать перенести обработку finished от QWebView в главный поток.
Код
Java
package weber2;
 
import com.trolltech.qt.QThread;
import com.trolltech.qt.core.Qt.ConnectionType;
import com.trolltech.qt.webkit.QWebView;
 
public class MainLoop implements Runnable
{
 public  int numCreated = 0,
                  numFinished = 0;
 
 public MainLoop()
 {
  QThread threadMainLoop = new QThread(this);
  threadMainLoop.start();
 }
 
 public void run()
 {
   while(true)
   {
        try {
     Thread.sleep(500);
    } catch (InterruptedException ex) {System.out.println("-->Corrupted error");}
 
    //create & start new thread
    ThreadCore core = new ThreadCore(this);
    core.signalCreateWebView.connect(this, "createWebView(ThreadCore)", ConnectionType.QueuedConnection);
    QThread thread = new QThread(core);
    thread.start();
   }
 }
 
 public void createWebView(ThreadCore thread)
{
 QWebView webView = new QWebView();
 this.numCreated ++;
 this.webView.loadFinished.connect(this, "finished()");
 this.webView.load(new QUrl("http://qt.nokia.com/"));
}
 
private final void finished()
{
  this.numFinished--;
 
  // Не знаю как это делается на java, пишу на C++
  QWebView *webView = qobject_cast<QWebView*>( sender() );
  // Обрабатываем завершение загрузки
}
 
}
 


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: niXman от Март 14, 2010, 08:44
я написал аналогичный код на с++.
все работает, ничего не утекает. но обнаружил странный момент. точнее не странный, а нежелательный.

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

в общем, выкладываю архив с проектом, может кто подскажет что и как.

зы
гонорар поделим ;)


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: niXman от Март 14, 2010, 10:45
разобрался.


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: BRE от Март 14, 2010, 10:54
Я бы попробовал делать загрузку в отдельном потоке используя объект QWebFrame.
Это не виджетный объект, и скорее всего он может работать в отдельных потоках.

P.S.  Кстати, я уже предлагал это попробовать в теме:
http://www.prog.org.ru/topic_11481_0.html


Название: Re: Утечка памяти, Qt Jambi.
Отправлено: niXman от Март 14, 2010, 10:58
BRE, вариант!
то что он не "виджетный", весьма радует!

спасибо!