Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выдавать информацию во время загрузки файла 
:(
    Опции темы
Alexey91
Дата 4.6.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Здравствуйте!!

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

Понимаю, что можно сделать свое считывание из файла, но мне интересен этот способ  smile 
Раньше работал с досовскими прерываниями, но здесь не знаю как делать, а компонент TTimer не прерывает процесс)
PM   Вверх
SVN74
Дата 5.6.2011, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



Цитата(Alexey91 @  4.6.2011,  19:38 Найти цитируемый пост)
Запускаю функцию LoadFromFile, если файл очень большой, то соответственно функция выполняться будет долго.
Можно ли как-то во время выполнения функции проявлять активность на форме (выдавать сообщения, изменять позицию прогресс-бара и.т.д.)

Можно.
Вкидайте ваш LoadFromFile в отдельный поток и работайте с формой спокойно.
PM MAIL WWW   Вверх
Alexey91
Дата 6.6.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



SVN74, можно подробнее про отдельный поток)
PM   Вверх
borisbn
Дата 6.6.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Alexey91, ты не сможешь получать от LoadFromFile уведомления о прогрессе.
если же создать отдельный поток, и запустить LoadFromFile в нём, то интерфейс тормозить не будет, но и информации о ходе загрузки ты не получишь. Мало того, если эта LoadFromFile  вызывается не у простого TStringList, а у какого-нибудь TMemo (memo->Lines->LoadFromFile( ... )), то в потоке этого делать категорически нельзя.

Лучший вариант - это написать свою такую функцию, которая бы сообщала о ходе загрузки, и вызвать её в отдельном потоке


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alexey91
Дата 6.6.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



 smile  Что-то я вообще запутался)) 

А можно какой-нибудь кусочек кода, который демонстирует запихивание в потоки?
PM   Вверх
borisbn
Дата 7.6.2011, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Alexey91 @  6.6.2011,  19:00 Найти цитируемый пост)
А можно какой-нибудь кусочек кода, который демонстирует запихивание в потоки?

Создаёшь класс, наследованный от TThread и реализуешь ф-цию Execute
Код

class MyThread : public TThread
{
...
protected:
  void __fastcall Execute() {
      while ( !Terminated ) {
          // здесь делаешь вещи, параллельные основному интерфейсному потоку
          // если нужно что-то сообщить на интерфейс, вызываешь
          Synchronize( showSomeThing );
      }
  }
  void __fastcall showSomeThing() {
      Form1->Memo->Lines->Add( bla bla bla );
  }
};

потом создаёшь экземпляр этого класса и стартуешь поток
Код

MyThread * thread = new MyThread;
thread->Start(); // м.б. какая-то другая функция, а не Start... не помню

а вообще-то см. документацию по TThread. Там всё расписано


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alexey91
Дата 7.6.2011, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



borisbn

Рано я радовался))

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "u1.h"
#include "Unit2.h"
#include "Unit3.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TMyThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------

__fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::showSomething()
{

 Form1->RichEdit1->Lines->Add("bla bla bla");


}
//---------------------------------------------------------------------------

void __fastcall TMyThread::Execute()
{
 for(int i=0; i < 10000; i++)
 {
  if(Terminated) break;
  Synchronize(showSomething);
 }
}
//---------------------------------------------------------------------------



Файл содержащий функции по работе с потоком (^)
Код



if(OpenDialog1->Execute())   // после того, как нажали кнопку выбора файла
 {
  T->Priority=tpNormal;
  T->Resume();
  Form2->RichEdit2->Lines->LoadFromFile(OpenDialog1->FileName);
  T->Suspend();

 .............................................
 }


Как происходит работа (первые строчки) (^)

Проблема в том, что во время загрузки активности на форме никакой нет, и функция во время работы showSomething выполнятся только один раз

объект TMyThread создается таким образом TMyThread *T=new TMyThread(true);

Это сообщение отредактировал(а) Alexey91 - 7.6.2011, 10:49
PM   Вверх
borisbn
Дата 7.6.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Alexey91 @  7.6.2011,  10:44 Найти цитируемый пост)
Проблема в том, что во время загрузки активности на форме никакой нет, и функция во время работы showSomething выполнятся только один раз

ессно. ты не распараллелил загрузку из файла и поток, т.к. ф-ция showSomething вызывается в интерфейсном потоке (из-за Synchronize) и по другому - никак нельзя.
тебе нужно 
Цитата(borisbn @  6.6.2011,  16:26 Найти цитируемый пост)
Лучший вариант - это написать свою такую функцию, которая бы сообщала о ходе загрузки, и вызвать её в отдельном потоке

под этим я понимал, что ты сам будешь читать из файла, а не при помощи ф-ции LoadFromFile
должно быть что-то типа такого

Код

class MyThread : public TThread
{
...
згидшс:
  void setFileAndStart( AnsiString fileName ) {
      m_file = fopen( fileName.c_str(), "rt" );
      Resume();
  }
protected:
  void __fastcall Execute() {
      while ( !m_file.eof() ) {
          m_line = readLineFromFile(); // ну уж readLineFromFile - сам :)
          Synchronize( showSomeThing );
      }
  }
  void __fastcall showSomeThing() {
      Form1->Memo->Lines->Add( m_line );
  }

protected:
  FILE * m_file;
  AnsiString m_line;
};


Это сообщение отредактировал(а) borisbn - 7.6.2011, 11:00


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alexey91
Дата 7.6.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Тогда мне проще вообще потоки не использовать smile 
Проще в цикле считать файл, сделать прогресс бар и все будет хорошо smile
Хорошо, тогда буду доделывать так))

Мне вот непонятно, если функция вызывается в интерфейсном потоке почему нельзя использовать LoadFromFile?
и не понимаю почему не распараллелил

Если долго объяснить, кинь пожалйста еще инфы для ознакомления)
PM   Вверх
Dem_max
Дата 7.6.2011, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Цитата

Проще в цикле считать файл, сделать прогресс бар и все будет хорошо 

Все равно твоя функция будет блокировать основной поток.

Цитата

Мне вот непонятно, если функция вызывается в интерфейсном потоке почему нельзя использовать LoadFromFile?

Потому что может вылезти ошибка и твое приложение закроется.

Не ленись. 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Alca
Дата 7.6.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

Лучший вариант - это написать свою такую функцию, которая бы сообщала о ходе загрузки, и вызвать её в отдельном потоке

Используй ::PostMessage из потока (http://forum.vingrad.ru/forum/topic-60076.html)



--------------------
PM WWW ICQ Skype Jabber   Вверх
borisbn
Дата 7.6.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Dem_max @  7.6.2011,  11:11 Найти цитируемый пост)

Цитата
Проще в цикле считать файл, сделать прогресс бар и все будет хорошо

Все равно твоя функция будет блокировать основной поток.

можно сделать и без потока, но в цикле после каждой итерации (считывания одной строки) нужно вызывать
Код

Application->ProcessMessages();


а ф-цию LoadFromFile тебе никак не перехитрить. забудь про неё. пиши свою. она ж простая как пять копеек


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alexey91
Дата 7.6.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Как все начиналось, мне было просто лень писать свою считывания файла)) И у меня возникла мысль в голове "возьму-ка я напишу на форум вопрос, а мне
что-нибудь подскажут такое простенькое".
В результате это вылилось в целую трагедию  smile Я не леньсю, займусь потоками обязательно, но сейчас мне гораздо важнее просто доделать свою работу.

Залепал statusbar  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.