Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поток, WaitForSingleObject в цикле. 
:(
    Опции темы
lv151
Дата 30.6.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код


CEvent event(FALSE, TRUE);

UINT ThreadProc(LPVOID param)
{
    ..............
        .............. 
    SetEvent(event);

    return 0;
}
............................
for(i= 0; i < size; i++)
{
     ResetEvent(event);

     AfxBeginThread(ThreadProc, NULL);
    
     BOOL run = FALSE;    
     
     while(!run)
     {
         WaitForSingleObject(event, 100);
     
         switch(status)
         {    
             case WAIT_OBJECT_0:
         {
             listCtrl.InsertString(...);
             break;
                 run = TRUE;
             }
         }
    } 
}    


Обязательно нужно дождаться завершения потока, но из за  while(!run) наблюдаются дикие тормоза.  Как лучше поступить в моей ситуации?
PM MAIL   Вверх
GoldFinch
Дата 30.6.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



WaitForSingleObject(event, 100);

замени 100 на INFINITE
PM MAIL ICQ   Вверх
lv151
Дата 30.6.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



То же самое.
Может быть дело в listCtrl?
INFINITE - теряется "асинхронность".

Это сообщение отредактировал(а) lv151 - 30.6.2009, 15:48
PM MAIL   Вверх
lv151
Дата 30.6.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

UINT ThreadProc(LPVOID param)
{    
    Sleep(1000);

    SetEvent(event);

    return 0;
}

LRESULT CDialiog1::OnNext() 
{                
    for(int i = 0; i < 100; i++)
    {
        ResetEvent(event);
        AfxBeginThread(ThreadProc, NULL);
        
        BOOL res = FALSE;
        
        while(!res)
        {            
            DWORD z = WaitForSingleObject(event, 10);
            switch(z) 
            {
                case WAIT_OBJECT_0:
                {
                    listBox.InsertString(0, "asdasdasd");
                    res = TRUE;
                    break;
                }            
            }
        }
    }
    return 0;
}


Ничего не попадает в list.
Точнее нет, через некоторое время приложение просыпается и строки добавляются в CListBox, но с тормозами и отрисовывается только скролл от него smile


Это сообщение отредактировал(а) lv151 - 30.6.2009, 16:17
PM MAIL   Вверх
GoldFinch
Дата 30.6.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



эм... твой код ждет в WaitForSingleObject только 1 раз
остальное время там просто бесконечный цикл
PM MAIL ICQ   Вверх
voov
Дата 1.7.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



Цитата(lv151 @  30.6.2009,  16:12 Найти цитируемый пост)
UINT ThreadProc(LPVOID param)
{    
    Sleep(1000);

    SetEvent(event);

    return 0;
}

а если убрать этот слип?
PM MAIL   Вверх
lv151
Дата 1.7.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



всё ок. 

Изменил логику работы с потоком. Получилось так, что в основном потоке был цикл, в теле которого и запускался поток.

Код

for(i= 0; i < size; i++)
{
     ResetEvent(event);
     AfxBeginThread(ThreadProc, NULL);
    
     BOOL run = FALSE;    
     
     while(!run)
     {
         WaitForSingleObject(event, 100);
     
         switch(status)
         {    
             case WAIT_OBJECT_0:
         {
             listCtrl.InsertString(...);
             break;
                 run = TRUE;
             }
         }
    } 
}    


в одном из топиков у меня проблема с передачей контрола СlistCtrl в поток.

AfxBeginThread(ThreadProc, listCtrl);
....
WaitForSingleObject(event, INFINITE); - Проблема в том, что я ожидал события, которое SetEvent-ось в функции потока. 

Висло в этом месте:
...
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); }
...

Сейчас я передаю его парента.


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


 




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


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

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