Как сделать, чтобы компоненты были активными?

 
0
 
C++
ava
SerK | 07.12.2016, 21:39
Проблема такая:

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

Как это реализовать?
Ответы (8)
ava
vol4ek | 08.12.2016, 05:53 #
По нажатию кнопки создавайте отдельный поток и в нем ыыполняйте всю обработку строк.
ava
feodorv | 08.12.2016, 10:58 (Отредактирован 08.12.2016 11:03) #
Можно и в одном потоке, главное - периодически очищать очередь сообщений. Например, после обновления данных в прогресс баре (через различные 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;
}

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


Спасибо за ответ. Ещё вопрос: как вызывать эту функцию BOOL DialogMessageLoop( HWND dialog )?  HWND dialog - что это?
ava
xvr | 08.12.2016, 13:44 #
Цитата (SerK @  8.12.2016,  12:02 findReferencedText)
Спасибо за ответ.

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

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

В поток надо было вынести выполнение этой самой функции, а вы что туда поместили?
ava
SerK | 08.12.2016, 21:49 #
Цитата (xvr @  8.12.2016,  13:44 findReferencedText)
В поток надо было вынести выполнение этой самой функции, а вы что туда поместили?


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

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;
}


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


Как им пользоваться в данном случае?
ava
xvr | 09.12.2016, 19:12 #
Цитата (SerK @  8.12.2016,  21:49 findReferencedText)
Поместил в файл потока:

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

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

Периодически вызывать в процессе длительных вычислений. Интервал между вызовами напрямую влияет на 'отзывчивость' интерфейса
ava
SerK | 10.12.2016, 09:55 #
Вычисления вызываются вне метода Synchronize

Цитата (xvr @  9.12.2016,  19:12 findReferencedText)
А где собственно вычисления? Если внутри 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 findReferencedText)
Периодически вызывать в процессе длительных вычислений.


Спасибо - разобрался с Application->ProcessMessages();
ava
mailworker6 | 10.12.2016, 22:37 #
http://tuvaonline.ru/banja_ydovolctvie_i_polza.dhtml

если вас интересует турецкая баня в Москве или хамам,
то вам тем более нужно в «Таёжные бани», где вашему желанию непременно найдётся реализация.
Интересной особенностью турецких бань всегда была было повышенное внимание к внутренней архитектуре и убранству,
которое должно сразу настроить посетителя на то, что он вступает в храм,
храм омовения и чистоты не только тела.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  SerK   xvr   vol4ek ava  feodorv ava  mailworker6
advanced
Отправить