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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Утечка памяти  (Прочитано 9708 раз)
Spark
Гость
« Ответ #15 : Июль 17, 2013, 15:28 »

Дело в том, что первоначально кнопка запускает функцию выбора текстового списка и в этой же функции прописан цикл слайдшоу.
И во второй раз нажимая кнопку (после паузы) мне не удалось избавиться от процесса выбора списка. Пришлось использовать дополнительную кнопку или контекстное меню кнопки для запуска дополнительной функции, переключающей булевой переменную - переключателя плей/пауза.

P.S. Но может я не понял совет. Вот если бы можно было как то заставлять нажатие кнопки генерировать иной сигнал, после смены состояния булевой переменной. Тогда было бы просто.
« Последнее редактирование: Июль 17, 2013, 15:36 от Spark » Записан
Spark
Гость
« Ответ #16 : Июль 17, 2013, 17:02 »

До кучи еще один вопрос на будущее. Каким образом организовывается рандомное чтение строк списка?
Записан
Spark
Гость
« Ответ #17 : Июль 17, 2013, 18:40 »

Пока разделил функцию. Проблему не решило, но может будет проще?
Код
C++ (Qt)
void MainWindow::slideshowOn(bool on)
{
   if(!on)return;
   slideShowQuit = false;
   slideShowStop = false;
 
   QString importPath;
   if( cfg.contentExportPath.isEmpty() )
       importPath = QDir::homePath();
   else
   {
       importPath = QDir::fromNativeSeparators( cfg.contentExportPath );
       if( !QDir( importPath ).exists() )
           importPath = QDir::homePath();
   }
 
   QString fileName = QFileDialog::getOpenFileName( this, tr( "Slideshow content from file" ),
                                                    importPath,
                                                    tr( "Text files (*.txt);;All files (*.*)" ) );
   if( fileName.size() == 0)
   {
       slideshowButton->setChecked(false);
       return;
   }
 
   QFileInfo fileInfo( fileName );
   QString contentName = fileInfo.baseName();
   QFile file( fileName );
   int n(0);
 
 
   // Count slides
   if ( file.open( QFile::ReadOnly ) )
   {
 
       char buf[1024];
       qint64 lineLength;
       forever
       {
           lineLength = file.readLine(buf, sizeof(buf));
           if (lineLength > 0)
           {
               ++n;
           }
           else if (lineLength == -1)
           {
               break;
           }
       }
       file.close();
   }
 
 
       if ( file.open( QFile::ReadOnly | QIODevice::Text ) )
 
       {
 
 
       QTextStream fileStream( & file );
       QString itemStr;
 
 
       QString str;
       str.setNum(n);
 
 
       slidePopup->setWindowTitle( contentName + "/" + str );
 
// slide Show
       do
       {
 
// Pause
           do
           {
               QEventLoop loop;
               QTimer::singleShot(0, &loop, SLOT(quit()));
               loop.exec();
           } while(slideShowStop);
 
 
           itemStr = fileStream.readLine();
           if( fileStream.status() >= QTextStream::ReadCorruptData )
               break;
 
           trimmedStr = itemStr.trimmed();
           if( trimmedStr.isEmpty() )
               continue;
 
           QEventLoop loop3;
           QTimer::singleShot(cfg.preferences.slideShowTimer, &loop3, SLOT(quit()));
           loop3.exec();
 
           updateShow();
 
           if(slideShowQuit)break;
 
       } while( !fileStream.atEnd() );
 
       file.close();
       }
}
 
void MainWindow::updateShow()
{
           if(slideshowPopup->isChecked())slidePopup->slideTranslationFor( trimmedStr );
           if(slideshowGrand->isChecked())showTranslationFor( trimmedStr );
}
Записан
Spark
Гость
« Ответ #18 : Июль 17, 2013, 18:43 »

И еще, я конечно много недопонимаю.
Но может поясните, почему в этой конструкции таймер не сработал:
Код
C++ (Qt)
       do
       {
 
           do
           {
               QEventLoop loop;
               QTimer::singleShot(0, &loop, SLOT(quit()));
               loop.exec();
           } while(slideShowStop);
 
 
           itemStr = fileStream.readLine();
           if( fileStream.status() >= QTextStream::ReadCorruptData )
               break;
 
           trimmedStr = itemStr.trimmed();
           if( trimmedStr.isEmpty() )
               continue;
 
 
           QTimer::singleShot(cfg.preferences.slideShowTimer, this, SLOT(updateShow()));
 
           if(slideShowQuit)break;
 
     } while( !fileStream.atEnd() );
 
Слайды показываются - пробегают.
Где напутал?

P.S.
Понял свою ошибку. Эта конструкция бессмысленна, но кажется осознал, что хотел сказать Old. Ну что ж учимся потихоньку. Уже завтра попробуем организовать слайдшоу по иному.
« Последнее редактирование: Июль 17, 2013, 20:05 от Spark » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #19 : Июль 18, 2013, 11:15 »

P.S. Но может я не понял совет. Вот если бы можно было как то заставлять нажатие кнопки генерировать иной сигнал, после смены состояния булевой переменной. Тогда было бы просто.
Хандли состояние этой переменной в слоте, кот. привязан к кнопке.
Код
C++ (Qt)
enum states {
   fristState,
   secondState,
   nState
};
 
void MainWindowtete::onButtonPushed()
{
 
   switch (state) {
   // первоначальное состояние
   case fristState:
   {
       doWork1(); // ... некоторая работа
       state = secondState; // в сл. раз при вызове этого слота уже на выполнится блок в сл. case
   }
       break;
   case secondState:
   {
       doWork2(); // .. некоторая другая работа...
       state = nState;
   }
       break;
   case nState:
   {
       doWorkN(); // завершающая работа
       state = fristState; // переходим к первоначальному состоянию
   }
       break;
   default:
       break;
   }
}
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Spark
Гость
« Ответ #20 : Июль 18, 2013, 16:50 »

Kurles
Спасибо за наводку. Пошел несколько иначе, более традиционным способом (для меня), но пищу дали для размышления как можно реализовать. Сейчас кнопка работает как задумал. Сначала выбираем файл, а затем уже  она работает как Pause/Play.
Код
C++ (Qt)
void MainWindow::slideshowOn(bool on)
{
   if(!on)
   {
       slideShowPause = true;
       return;
   }
   else if(slideShowPlay && slideShowPause)
   {
       slideShowPause = false;
       return;
   }
   else
   {
       slideShowPlay = true;
       slideShowPause = false;
 
       QString importPath;
       if( cfg.historyExportPath.isEmpty() )
           importPath = QDir::homePath();
       else
   {
       importPath = QDir::fromNativeSeparators( cfg.contentExportPath );
       if( !QDir( importPath ).exists() )
           importPath = QDir::homePath();
   }
 
   QString fileName = QFileDialog::getOpenFileName( this, tr( "Slideshow content from file" ),
                                                    importPath,
                                                    tr( "Text files (*.txt);;All files (*.*)" ) );
   if( fileName.size() == 0)
   {
       slideshowButton->setChecked(false);
       return;
   }
 
   QFileInfo fileInfo( fileName );
   QString contentName = fileInfo.baseName();
   QFile file( fileName );
   int n(0);
 
   // Count slides
   if ( file.open( QFile::ReadOnly ) )
   {
 
       char buf[1024];
       qint64 lineLength;
       forever
       {
           lineLength = file.readLine(buf, sizeof(buf));
           if (lineLength > 0)
           {
               ++n;
           }
           else if (lineLength == -1)
           {
               break;
           }
       }
       file.close();
   }
 
       if ( file.open( QFile::ReadOnly | QIODevice::Text ) )
 
       {
 
       QTextStream fileStream( & file );
       QString itemStr;
 
       QString str;
       str.setNum(n);
 
       slidePopup->setWindowTitle( contentName + "/" + str );
 
// slide Show
       do
       {
 
// Pause
           do
           {
               QEventLoop loop;
               QTimer::singleShot(0, &loop, SLOT(quit()));
               loop.exec();
           } while(slideShowPause);
 
                    // Play
           itemStr = fileStream.readLine();
           if( fileStream.status() >= QTextStream::ReadCorruptData )
               break;
 
           trimmedStr = itemStr.trimmed();
           if( trimmedStr.isEmpty() )
               continue;
 
           QEventLoop loop3;
           QTimer::singleShot(cfg.preferences.slideShowTimer, &loop3, SLOT(quit()));
           loop3.exec();
 
           updateShow();
 
           if(slideShowQuit)break;
 
       } while( !fileStream.atEnd() );
 
       file.close();
       }
}

Осталось решить одну глобальную проблему - нормальный выход из программы. Тем более, что данная реализация усугубляет проблему. В режиме паузы, выход тоже затруднен. Процесс слайдшоу то по существу не закрыт. Конечно в дальнейшем наверное паузу надо реализовать как то иначе, не путем пустого цикла. Может гуру подскажут иную реализацию. Ясно, что как то надо запомнить номер строки и в следующий раз начать с нее.
« Последнее редактирование: Июль 18, 2013, 17:10 от Spark » Записан
Spark
Гость
« Ответ #21 : Июль 19, 2013, 04:04 »

Сделал простенько, но со вкусом:

  connect( ui.quit, SIGNAL( triggered() ),
           qApp, SLOT( quit() ) );

Код
C++ (Qt)
 connect( ui.quit, SIGNAL( triggered() ),
          this, SLOT( quitApp() ) );
 
void MainWindow::quitApp()
{
   slideShowStop = true;
   qApp->quit();
}

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


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