На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Цикл обработки сообщений в потоке. , В потоке диалог и DoModal() не работает, пока не вышел из функции, запустившей поток!
    Есть диалоговое приложение, на диалоге кнопка, запускающая поток, в котором вызывается DoModal другого диалога. Функция, запускающая поток:
    ExpandedWrap disabled
      void CProvStaticFontDlg::OnBnClickedButtonZapustitPotok()
      {
          // TODO: Add your control notification handler code here
          LPVOID pParam=(LPVOID) this;
          AfxBeginThread(PotokDialog, pParam);
      /// AfxMessageBox("Запустили поток");
          Sleep(10000);
          if(d!=NULL) ::PostMessage(d->m_hWnd, WM_CLOSE, 0, 0);
          Sleep(5000);
          AfxMessageBox("Диалог должен закрыться");
      }


    Функция потока:
    ExpandedWrap disabled
      UINT __cdecl PotokDialog(LPVOID pParam)
      {
          CProvStaticFontDlg *pD=(CProvStaticFontDlg*)pParam;
          CTestDialogPotok dp;
          dp.SetText("Проверка инициализации текста в диалоге");
          pD->d=(CWnd*) &dp;
          dp.DoModal();
          pD->d=NULL;
          return(0);
      };


    Диалог в функции потока создается только после выхода из функции запуска потока! Но если раскоментировать строку:
    ExpandedWrap disabled
      /// AfxMessageBox("Запустили поток");


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

    Я смотрел в MSDN работу потоков, там написано, что в каждом потоке свой цикл обработки сообщений и диалог из потоковой функции не должен зависать. Я так понимаю, что есть цикл сообщений для главного потока и есть циклы сообщений для параллельных потоков? Или не так?
      Цитата a_n_y_a @
      Я смотрел в MSDN работу потоков, там написано, что в каждом потоке свой цикл обработки сообщений и диалог из потоковой функции не должен зависать. Я так понимаю, что есть цикл сообщений для главного потока и есть циклы сообщений для параллельных потоков? Или не так?

      В MFC есть два вида потоков рабочий и интерфейсный, т.е. поток в котором есть цикл обработки сообщений.
      Так вот у тебя создается рабочий поток.
      Сообщение отредактировано: Cfon -
        Цитата Cfon @
        Цитата a_n_y_a @
        Я смотрел в MSDN работу потоков, там написано, что в каждом потоке свой цикл обработки сообщений и диалог из потоковой функции не должен зависать. Я так понимаю, что есть цикл сообщений для главного потока и есть циклы сообщений для параллельных потоков? Или не так?

        В MFC есть два вида потоков рабочий и интерфейсный, т.е. поток в котором есть цикл обработки сообщений.
        Так вот у тебя создается рабочий поток.

        Я про интерфейсный поток никогда не слышал, мог бы ты рассказать о нем или дать ссылочку? Какая функция запускает интерфейсный поток?
          надо создать производный класс от CWndThread, и переопределиь InitInstance, в которой создавть свой новый диалог, потом передавать этот поток класса в AfxBeginThread. Сам класс чтобы не заморачиваться можно создать через мастер ClassView->Add Class.

          Добавлено
          поток создается след образом:
          ExpandedWrap disabled
            AfxBeginThread(RUNTIME_CLASS(CMyThread));
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0266 ]   [ 16 queries used ]   [ Generated: 2.05.24, 08:10 GMT ]