Russian Qt Forum
Май 02, 2024, 16:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Утечка памяти, Qt Jambi.  (Прочитано 8086 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Март 13, 2010, 19:46 »

Есть работа по Qt Jambi. Имеется утечка памяти для QWebView, надо устранить (средствами JNI, неважно чем).
Код в архиве.
Вознаграждение: начнём с $50.
Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #1 : Март 13, 2010, 20:06 »

Я не специалист в Java, но такой вопрос...
Я правильно понял работу программы?
Запускается основной поток, который периодически запускает новый поток ThreadCore.
Этот поток отсылает сигнал главному, при переключении на который, главный поток создает объект QWebView (в своем контексте) и запускает загрузку страницы.
Для чего нужен поток ThreadCore, если все созданные объекты QWebView работают в контексте главного потока (там где они и создавались)?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Март 13, 2010, 21:09 »

Я не специалист в Java, но такой вопрос...
Я правильно понял работу программы?
Запускается основной поток, который периодически запускает новый поток ThreadCore.
Этот поток отсылает сигнал главному, при переключении на который, главный поток создает объект QWebView (в своем контексте) и запускает загрузку страницы.
Для чего нужен поток ThreadCore, если все созданные объекты QWebView работают в контексте главного потока (там где они и создавались)?
На самом деле это очень урезанный вариант программы (оставил только самое базовое для простоты), в оригинальной во второстепенном потоке выполняются определённые операции, на основе которых и испускается сигнал на создание qwebview.
Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #3 : Март 13, 2010, 21:27 »

На самом деле это очень урезанный вариант программы (оставил только самое базовое для простоты), в оригинальной во второстепенном потоке выполняются определённые операции, на основе которых и испускается сигнал на создание qwebview.
Если все равно QWebView создаются и работают в основном потоке, для чего его настройка и финиширование обрабатывает объек ThreadCore.
Логичней если это будет происходить в слотах главного потока.

Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Март 13, 2010, 21:35 »

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

Если все равно QWebView создаются и работают в основном потоке,
Не работают, а только создаются, загрузка контента в qwebview, как известно, асинхронна, на основной поток не влияет. А создаётся объект именно в гуи-потоке, т.к. во второстепенном его создание невозможно, зато возможно во второстепенном (т.е. асинхронно) произвести все нужные расчёты перед запросом создания qwebview в главном потоке.
« Последнее редактирование: Март 13, 2010, 21:41 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #5 : Март 13, 2010, 21:41 »

Потому что эти операции не должны становиться в очередь, а работать асинхронно.
Все QWebView работают в главном потоке, не в ThreadCore!
К моменту создания и начала загрузки QWebView, ThreadCore поток уже остановлен.
Для чего его объект должен ждать сигнал finished от QWebView?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Март 13, 2010, 21:44 »

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

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #7 : Март 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() );
  // Обрабатываем завершение загрузки
}
 
}
 
Записан
niXman
Гость
« Ответ #8 : Март 14, 2010, 08:44 »

я написал аналогичный код на с++.
все работает, ничего не утекает. но обнаружил странный момент. точнее не странный, а нежелательный.

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

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

зы
гонорар поделим Подмигивающий
Записан
niXman
Гость
« Ответ #9 : Март 14, 2010, 10:45 »

разобрался.
Записан
BRE
Гость
« Ответ #10 : Март 14, 2010, 10:54 »

Я бы попробовал делать загрузку в отдельном потоке используя объект QWebFrame.
Это не виджетный объект, и скорее всего он может работать в отдельных потоках.

P.S.  Кстати, я уже предлагал это попробовать в теме:
http://www.prog.org.ru/topic_11481_0.html
Записан
niXman
Гость
« Ответ #11 : Март 14, 2010, 10:58 »

BRE, вариант!
то что он не "виджетный", весьма радует!

спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 22.