Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с CEvent, виснет приложение 
:(
    Опции темы
Egoryan
  Дата 22.7.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

UINT Thread(LPVOID par)
{
    CTestEventDlg* Dlg=(CTestEventDlg*)par;
    for(int i=0;i<3000;i++)
        Dlg->m_List.AddString("test");
    // .....
    Dlg->event.SetEvent();
    return 0;
}
.................................

void CTestEventDlg::OnButton1() 
{
    CWinThread* thread=AfxBeginThread(Thread,this);
    bool Running=true;
    int result;
    while(Running)
    {
        result=::WaitForSingleObject(this->event.m_hObject,0);  
        if(result==WAIT_OBJECT_0)
            Running=false;
    }
    AfxMessageBox("ended");
}


Разбираюсь с CEvent,написал тестовое приложение. При щелчке на кнопке запускается поток,там выполняются какие-то действия и мне нужно отследить, когда  он завершит свою работу.
В классе диалога создал событие event. В потоковой функции вроде перевожу его в сигнальное состояние но почему-то оно не отслеживается и приложение "виснет"  smile  
PM MAIL   Вверх
Earnest
Дата 23.7.2006, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Неразумно запускать WaitForSingleObject в цикле: поставь один вызов и укжи тайм-аут INFINITE - будет тоже самое, но процессорное время жраться не будет.
Потом проверь отладчиком, доходишь ли ты до SetEvent в потоке.

Добавлено @ 08:25 
Думаю, не доходит, а стоит на первом же AddString. Знаешь, почему? Потому что AddString - это посылка сообщения LM_ADDSTRING окну, которое создано в главном потоке. Который в это время стоит и ждет ивента... Убери нафиг из потока всю работу с окнами - это дурная идея. 


--------------------
...
PM   Вверх
Rapalex
Дата 24.7.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Так как с евентами работать, какая идея, както пытался но так и не понял. Какой у них принцып действия??? 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 24.7.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



В двух словах: один (поток) ставит, другой ждет. Читай MSDN или, лучше, Рихтера.

Добавлено @ 13:51 
В данном случае события не при чем: Egoryan соорудил классический deadlock: 2 потока ждут друг друга, и никто не работает...  


--------------------
...
PM   Вверх
Rapalex
Дата 26.7.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Понеял, я можно простой примерчик, так на вскидку, к примеру диалог на нажатие кнопки посылает сообщение потоку умереть, и после сего ждёт пока тот не умрёт, после чего выходит из обработчика кнопки.
Как такое реализовать? 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 26.7.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Вот, очень схематично:
Код

class CTestEventDlg: public CDialog
{
public:
    CTestEventDlg();

    void OnButton();

    CEvent m_event;
    CWinThread* m_pThread;
};


UINT ThreadProc (LPVOID par)
{
    CTestEventDlg* pDlg = (CTestEventDlg*)par;
     while (true)
     {
        if (WaitForSingleObject (pDlg->m_event, 0) == WAIT_OBJECT_0)
            break;
        // делаем что-нибудь
     }

    return 0;
}
.................................
CTestEventDlg::CTestEventDlg():
    m_event (FALSE, FALSE)
{
   m_pThread = AfxBeginThread (ThreadProc, this);
}

void CTestEventDlg::OnButton() 
{
    m_event.SetEvent();
    
    if (WaitForSingleObject (m_pThread->m_hThread, 15000) != WAIT_OBJECT_0)
    {
        // на всякий случай...
       ::TerminateThread  (m_pThread->m_hThread, -1);
    }

}
 


--------------------
...
PM   Вверх
Rapalex
Дата 8.6.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Цитата(Earnest @  24.7.2006,  13:49 Найти цитируемый пост)
 Читай MSDN или, лучше, Рихтера.

Earnest, прошу прощения за задержку, но по ходу у Рихтера книг несколько, так в какой глятуть?


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 13.6.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Rapalex @  8.6.2007,  16:40 Найти цитируемый пост)
 у Рихтера книг несколько

В наших магазинах только одну видела\знаю. Но несколько изданий.
Windows для проффесионалов, издание любое, но лучше, конечно, посовременней.



--------------------
...
PM   Вверх
Rapalex
Дата 6.11.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Earnest, Спасибо только что сделал тестовую прогу с твоим кодом, всё работет.
Я так понят эвент это типа булевской переменой, только это обект ядра...

Так у меня новй вопрос возник, а как правильно потоку просигнализировать о том что поток завершон, закончил своё дело?


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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