Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать, чтобы компоненты были активными? ... при выполнении функуции 
:(
    Опции темы
SerK
Дата 7.12.2016, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблема такая:

При нажатии на Кнопку (выполняется фукнция обработки строк), все компоненты перестают реагировать пока функция не выполнится.
А мне нужно выводить данные в Прогресс бар - как функция выполняется: какая строка обрабатывается, какая позиция искомого слова, время выполнения. Словом отображать весь ход работы функции. 

Как это реализовать?


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
vol4ek
Дата 8.12.2016, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


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

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



По нажатию кнопки создавайте отдельный поток и в нем ыыполняйте всю обработку строк.
PM MAIL ICQ   Вверх
feodorv
Дата 8.12.2016, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



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

BOOL ustpHelloDialogMessageLoop( HWND dialog )
{
  MSG msg;

  for( ;; )
  {
    BOOL bRet;

    if( !PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE) ) break;
    if( (bRet = GetMessage( &msg, 0, 0, 0)) == 0 ) break;

    if( bRet < 0 )
    {
      /* system error */
      return FALSE;
    }

    if( !IsWindow( dialog ) || !IsDialogMessage( dialog, &msg) )
    {
      TranslateMessage( &msg );
      DispatchMessage( &msg );
    }
  }

  return TRUE;
}

Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя).

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
feodorv
Дата 8.12.2016, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



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

BOOL DialogMessageLoop( HWND dialog )
{
  MSG msg;

  for( ;; )
  {
    BOOL bRet;

    if( !PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE) ) break;
    if( (bRet = GetMessage( &msg, 0, 0, 0)) == 0 ) break;

    if( bRet < 0 )
    {
      /* system error */
      return FALSE;
    }

    if( !IsWindow( dialog ) || !IsDialogMessage( dialog, &msg) )
    {
      TranslateMessage( &msg );
      DispatchMessage( &msg );
    }
  }

  return TRUE;
}

Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя).

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
feodorv
Дата 8.12.2016, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



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

BOOL DialogMessageLoop( HWND dialog )
{
  MSG msg;

  for( ;; )
  {
    BOOL bRet;

    if( !PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE) ) break;
    if( (bRet = GetMessage( &msg, 0, 0, 0)) == 0 ) break;

    if( bRet < 0 )
    {
      /* system error */
      return FALSE;
    }

    if( !IsWindow( dialog ) || !IsDialogMessage( dialog, &msg) )
    {
      TranslateMessage( &msg );
      DispatchMessage( &msg );
    }
  }

  return TRUE;
}

Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя).

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
feodorv
Дата 8.12.2016, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



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

BOOL DialogMessageLoop( HWND dialog )
{
  MSG msg;

  for( ;; )
  {
    BOOL bRet;

    if( !PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE) ) break;
    if( (bRet = GetMessage( &msg, 0, 0, 0)) == 0 ) break;

    if( bRet < 0 )
    {
      /* system error */
      return FALSE;
    }

    if( !IsWindow( dialog ) || !IsDialogMessage( dialog, &msg) )
    {
      TranslateMessage( &msg );
      DispatchMessage( &msg );
    }
  }

  return TRUE;
}

Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя).

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
feodorv
Дата 8.12.2016, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



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

BOOL DialogMessageLoop( HWND dialog )
{
  MSG msg;

  for( ;; )
  {
    BOOL bRet;

    if( !PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE) ) break;
    if( (bRet = GetMessage( &msg, 0, 0, 0)) == 0 ) break;

    if( bRet < 0 )
    {
      /* system error */
      return FALSE;
    }

    if( !IsWindow( dialog ) || !IsDialogMessage( dialog, &msg) )
    {
      TranslateMessage( &msg );
      DispatchMessage( &msg );
    }
  }

  return TRUE;
}

Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя).

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
SerK
Дата 8.12.2016, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @  8.12.2016,  10:58 Найти цитируемый пост)
Можно и в одном потоке, главное - периодически очищать очередь сообщений. Например, после обновления данных в прогресс баре (через различные SendMessage) можно вызвать такую функцию


Спасибо за ответ. Ещё вопрос: как вызывать эту функцию BOOL DialogMessageLoop( HWND dialog )?  HWND dialog - что это?

Добавлено через 1 минуту и 58 секунд
Цитата(vol4ek @  8.12.2016,  05:53 Найти цитируемый пост)
По нажатию кнопки создавайте отдельный поток и в нем ыыполняйте всю обработку строк.


Спасибо за ответ. Создал поток, но это не повлияло на главную форму - она как была заторможенной во время выполнения функции, так и осталась.



--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
xvr
Дата 8.12.2016, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SerK @  8.12.2016,  12:02 Найти цитируемый пост)
Спасибо за ответ.

В Builder'е есть специальный метод для такой обработки - Application->ProcessMessages();

Цитата(SerK @  8.12.2016,  12:02 Найти цитируемый пост)
Создал поток, но это не повлияло на главную форму - она как была заторможенной во время выполнения функции, так и осталась.

В поток надо было вынести выполнение этой самой функции, а вы что туда поместили?

PM MAIL   Вверх
SerK
Дата 8.12.2016, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xvr @  8.12.2016,  13:44 Найти цитируемый пост)
В поток надо было вынести выполнение этой самой функции, а вы что туда поместили?


Поместил в файл потока:
Код

void __fastcall MyT::Execute()
{
    Synchronize(Process);
}
//---------------------------------------------------------------------------
void __fastcall MyT::Process()
{
    chictovprover(Form1->SynMemo2->Text,"");
}


а вызов в файле главной формы:
Код

MyT *Thread;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thread = new MyT(false);
Thread->FreeOnTerminate= 0;
}


Добавлено через 4 минуты и 19 секунд
Цитата(xvr @  8.12.2016,  13:44 Найти цитируемый пост)
В Builder'е есть специальный метод для такой обработки - Application->ProcessMessages();


Как им пользоваться в данном случае? 


Это сообщение отредактировал(а) SerK - 8.12.2016, 21:51


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
xvr
Дата 9.12.2016, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(SerK @  8.12.2016,  21:49 Найти цитируемый пост)
Поместил в файл потока:

А где собственно вычисления? Если внутри MyT::Process, то это неправильно. Реальные вычисления должны вызываться вне метода Synchronize

Цитата(SerK @  8.12.2016,  21:49 Найти цитируемый пост)
Как им пользоваться в данном случае? 

Периодически вызывать в процессе длительных вычислений. Интервал между вызовами напрямую влияет на 'отзывчивость' интерфейса

PM MAIL   Вверх
SerK
Дата 10.12.2016, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вычисления вызываются вне метода Synchronize

Цитата(xvr @  9.12.2016,  19:12 Найти цитируемый пост)
А где собственно вычисления? Если внутри MyT::Process, то это неправильно. Реальные вычисления должны вызываться вне метода Synchronize



Код

void __fastcall MyT::Execute()
{
    Synchronize(Process);
}
//---------------------------------------------------------------------------
void __fastcall MyT::Process()
{
    chictovprover(Form1->SynMemo2->Text,"");
}
//---------------------------------------------------------------------------
String __fastcall MyT::chictovprover(String text1,String text2)
{
// код
}


Цитата(xvr @  9.12.2016,  19:12 Найти цитируемый пост)
Периодически вызывать в процессе длительных вычислений.


Спасибо - разобрался с Application->ProcessMessages();


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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