Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Приложение нереагрует пока функция ...  (Прочитано 9584 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Thead
Гость
« : 10-08-2004 00:44 » 

Люди подскажите

есть в одна функция functOperatin()
при после запуска данной функции
приложение нереагрует..  пока
функция не закончит работать

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

Подскажите простой способ AfxbeginThead() не
подходит пото что функция functOperatin...
является членом класса диалога (CDialog)
Записан
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 10-08-2004 05:10 » 

Thead, вынужден тебя огорчить, но без второго потока не обойтись, можешь воспользоваться классом CWinThread.
Подумаешь что она является членом класса CDialog, если вопрос в использовании данных класса, так их можно передавать в другой поток кучей способов.
Опиши задачу конкретнее, а то тут можно развести теории до ... Отлично.
Записан

Fatal error C1: Brain expected
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 10-08-2004 06:26 » 

Thead, насколько я втречался с подобным, мне больше всего понравилось такое:
Код:
void LongProcess()
{
   MSG msg;
   for (;;;)
   {
      //делаем возможность прервать
      if(::PeekMessage(&msg,0,0,0,PM_REMOVE))
      {
         ::TranslateMessage(&msg);
         ::DispatchMessage(&msg);
      }

      if(m_bStop){ return; }

      {
         //здесь часть действия
      }
   }
}

Код:
//запуск процесса
Go()
{
   m_bStop=false;
   LongProcess();
   m_bStop=true;
}

Код:
//обработчик нажатия кнопки STOP
void OnbnSTOP() { m_bStop=true; }

Но есть один подводный камень: нельзя давать программе закрываться во время работы цикла выборки сообщений - прога зависает.
Для этого в главном окне (зависит от того, какое оно) делаем
Код:
void CMainFrame::OnClose()
{
   if(!m_bStop) //неправильно
   {
      ::AfxMessageBox("сначала остановите процесс");
      return;
   }
   CFrameWnd::OnClose();
}

здесь "//неправильно" имеется в виду - доступ к переменной m_bStop показан схематически, на самом деле всё зависит от места определения этой переменной.
« Последнее редактирование: 30-11-2007 22:14 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 10-08-2004 07:38 » 

Цитата: Thead
AfxbeginThead() не
подходит пото что функция functOperatin...
является членом класса диалога (CDialog)


Ну и что? Передай указатель на класс в треад и вызови ф-ю
типа

UINT MyThreadFunction(LPVOID lParam)
{
   CMyDialog* pMyDlg = (CMyDialog*)lParam;
...
   pMyDlg->functOperatin();
...
   return 0;
}



void CMyDialog::OnThreadStart()
{
.....
   CWinThread* thread = AfxBeginThread( MyThreadFunction, this);
.....
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #4 : 10-08-2004 12:16 » 

Без потока нельзя никак.
Сам подумай - есть цикл обработки мессаг. Получил мессагу - обработал, получил следующую...... Если обработка затянулась - то цикл будет ждать пока она не закончится (потому как цикл и олбработка в одном потоке).

В принципе ты можешь сделать следующую вещь (может тебе это подойдет) - перед твоей долгой процой выкинуть диаложек на экран - типа "Юзверь, жди!" и пока обрабатывается ставить твоему родному диаложку WM_DISABLED.

Тока ProgressBar поставь обязательно -  а то юзвери сочтут что ты издеваешься через час смотрения на фразу про ожидание.

Удачи.
Записан

Сила ночи, сила дня - одинакого фигня....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-04-2006 18:22 » 

(комент)

FAQ или   статья
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines