Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WaitForSingleObject лочит тред? 
V
    Опции темы
feodorv
Дата 10.7.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mrgloom @  10.7.2012,  16:54 Найти цитируемый пост)
ну и какой из этого вывод?

Так у Вас был статик или не статик?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
mrgloom
Дата 10.7.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @  10.7.2012,  16:06 Найти цитируемый пост)
ну и какой из этого вывод?

Так у Вас был статик или не статик? 


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

но я поспешил радоватся, ибо я попробовал на простом примере.

Код

UINT test_func(LPVOID pParam)
{
    for(int r=0;r<100;++r)
    {
        for(int c=0;c<100;++c)
        {
            if(::WaitForSingleObject(m_StopThread, 0) == WAIT_OBJECT_0)
            {
                // Set event
                ::SetEvent(m_WaitThread);

                LogMsg(_T("return from thread \r\n"));
                return 0;
            }
            else
            {
                Sleep(3000);//имитация деятельности
            }
        }
    }
    return 0;
}


но когда я пытаюсь добавить обновление чисел на форме, всё опять виснет на WaitForSingleObject (который по кнопке пауза)
Код

::SetEvent(m_StopThread);
::WaitForSingleObject(m_WaitThread, INFINITE);//тут виснет


Код

UINT test_func(LPVOID pParam)
{
    CControlDlg* pthis= reinterpret_cast<CControlDlg*>(pParam);
    for(int r=0;r<100;++r)
    {
        for(int c=0;c<100;++c)
        {
            if(::WaitForSingleObject(m_StopThread, 0) == WAIT_OBJECT_0)
            {
                // Set event
                ::SetEvent(m_WaitThread);

                LogMsg(_T("return from thread \r\n"));
                return 0;
            }
            else
            {
                Sleep(3000);//имитация деятельности
            }

            pthis->UpdateControls();
        }
    }
    return 0;
}




т.е. такое ощущение что это что то связано с механизмом работы DoDataExchange

Это сообщение отредактировал(а) mrgloom - 10.7.2012, 16:32
PM MAIL   Вверх
feodorv
Дата 10.7.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mrgloom @  10.7.2012,  17:20 Найти цитируемый пост)
            pthis->UpdateControls();

А там наверняка сообщения в оконную процедуру используются? smile 

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

Добавлено через 1 минуту и 19 секунд
И ещё:
Цитата(mrgloom @  10.7.2012,  17:20 Найти цитируемый пост)
UINT test_func(LPVOID pParam)
{
    CControlDlg* pthis= reinterpret_cast<CControlDlg*>(pParam);
    for(int r=0;r<100;++r)
    {
        for(int c=0;c<100;++c)
        {
            if(::WaitForSingleObject(m_StopThread, 0) == WAIT_OBJECT_0)
            {
                // Set event
                ::SetEvent(m_WaitThread);
                LogMsg(_T("return from thread \r\n"));
                return 0;
            }
            else
            {
                Sleep(3000);//имитация деятельности
            }
            pthis->UpdateControls();
        }
    }
    ::SetEvent(m_WaitThread);
    return 0;
}




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
mrgloom
Дата 10.7.2012, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @  10.7.2012,  16:37 Найти цитируемый пост)
А там наверняка сообщения в оконную процедуру используются?  

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


не очень понял, MsgWaitForMultipleObjects это вроде как не к тредам, а к сообщениям относится?


раньше использовал, такой набросок найденный в сети, но честно говоря, не очень понимаю как это всё работает, потом решил переписать через треды, получается тут через треды нельзя? и меня не устроило, то что этот код хорошо работает, только если у нас итерация цикла маленькая, а так пользователю надо потстоянно жать на кнопку отмена(чтобы не пропустить момент), а надо нажал, программа подождала пока завершится текущая итерация(забокировав гуи).



Код

BOOL CControlDlg::PumpMessage(void)
{
   CWinThread *pThread = AfxGetThread();
   MSG msg;
   while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
   {
       if (!pThread->PumpMessage()) 
           break; 
   }
   if(m_Session.State == PAUSED)
     return FALSE;
   return TRUE;
};


PM MAIL   Вверх
baldina
Дата 10.7.2012, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

while (true)
{
    // Ждем сообщения и событие m_Event
    DWORD result = MsgWaitForMultipleObjects (1, &m_Event, FALSE, INFINITE, QS_ALLINPUT);

    if (result == (WAIT_OBJECT_0 + 1))
    {
      // Есть сообщения в очереди
      MSG msg;

      while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
        DispatchMessage(&msg);
    }
    else
      // Сообщение m_Event получено
      break;
}

PM MAIL   Вверх
feodorv
Дата 10.7.2012, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mrgloom @  10.7.2012,  18:11 Найти цитируемый пост)
получается тут через треды нельзя?

Можно.

Цитата(mrgloom @  10.7.2012,  18:11 Найти цитируемый пост)
MsgWaitForMultipleObjects это вроде как не к тредам, а к сообщениям относится?

Не просто к сообщениям, а в том числе и к тем, которые обновляют форму.

Вот кусок кода, который ждёт завершения потока, одновременно обрабатывая сообщения:
Код

    for( ;; )
    {
      MSG msg;
      DWORD rv = MsgWaitForMultipleObjects( 1, &r->thread, FALSE, INFINITE, QS_ALLINPUT);
      if( rv == WAIT_OBJECT_0 ) break;
      if( rv == WAIT_FAILED )
      {
        /* XXX: error */
        break;
      }
      while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE) )
      {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
      }
    }


Добавлено через 1 минуту и 8 секунд
Ой, пока искал код, baldina уже всё написал smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
mrgloom
Дата 11.7.2012, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



спасибо, всё заработало.

только с теоретической точки зрения непонятно, почему сообщения лочили выполнение кода в треде.
PM MAIL   Вверх
baldina
Дата 11.7.2012, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



они не лочили. просто окошко "подвисло", т.к. управляется сообщениями, а они не проходили. теперь мы их обработали, и стало все ок
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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