crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> deadlock
zss
  опции профиля:
сообщение 24.6.2009, 15:00
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 112
Регистрация: 9.6.2009
Пользователь №: 815

Спасибо сказали: 0 раз(а)




Репутация:   0  


ситуация следующая.

Есть QMainWidow у которого есть потоковый метод. Он крутиться по флагу, вычитывает данные и посылает событие.

void QMainWindow::start()
{
    ...
    m_stopped = false;
    thread->start();
    ...
}
void QMainWindow::stop()
{
    ...
    m_stopped = true;
    thread->wait();
    ...
}

void QMainWindow::execute()
{
    while (!m_stopped)
    {
        // read data
        QCoreApplication::postEvent(new MyEvent(mydata));
    }
}


так вот иногда происходит висяк. Преположение в том, что customEvent для QMainWindow
работает в первичном потоке и stop() тоже работает в первичном потоке.

Так вот если я выставил флаг и жду, то первичный поток блокируется.
В этот момент мой поток прочитал данные, и пытается послать событие.

Может ли в данном случае быть deadlock или postEvent отработает всегда ?
Если так, то где может быть висяк и как его разрулить ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
zss
  опции профиля:
сообщение 24.6.2009, 16:15
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 112
Регистрация: 9.6.2009
Пользователь №: 815

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 24.6.2009, 17:07) *
А тут висяк вполне может быть, если устройство с которого читаешь долго ничего не возвращает и до проверки твоего флага m_stopped дело не доходит. При этом естессно и гуй висит.


ладно - тогда подробнее

поток читает и посылает события. Он проверяет завершение на флаге.
Первичный поток хочет его остановить. Он запускает поток, в котором выставляется флаг и ожидается
завершение читающего потока. Но т.к. обработка событий в первичном потоке, то где-го висяк.
Причем он не всегда.

Пример
void stop()
{
   stopThread->start();
   stopThread->wait();
}
void funcStopThread ()
{
    m_stopped = true;
    readThread->wait();
}
void readThread()
{
    while(!m_stopped)
    {
        // read data
        QCoreApplication::postEvent(...);
        Sleep(1000);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- zss   deadlock   24.6.2009, 15:00
- - BRE   Что-то я не соображу, где "первичный" по...   24.6.2009, 15:19
- - SABROG   Висяк из-за того, что ты "захламляешь" о...   24.6.2009, 16:01
|- - BRE   Цитата(SABROG @ 24.6.2009, 17:01) Висяк и...   24.6.2009, 16:07
- - zss   не - sleep есть (код не целиком) более того - выпо...   24.6.2009, 16:03
- - SABROG   Посланные события выполняются в основном потоке, е...   24.6.2009, 16:07
- - zss   Цитата(BRE @ 24.6.2009, 17:07) А тут вися...   24.6.2009, 16:15
|- - BRE   Цитата(zss @ 24.6.2009, 17:15) поток чита...   24.6.2009, 16:31
- - SABROG   В итоге у тебя 3 потока: основной, читающий с устр...   24.6.2009, 16:29
- - zss   Цитата(zss @ 24.6.2009, 17:15) Тогда ждат...   24.6.2009, 16:39
- - SABROG   Цитата(zss @ 24.6.2009, 17:39) второго - ...   24.6.2009, 16:50
- - zss   Цитата(zss @ 24.6.2009, 17:39) Того, кото...   24.6.2009, 16:58
- - SABROG   Цитата(zss @ 24.6.2009, 17:58) так я в не...   24.6.2009, 17:21
- - zss   Цитата(zss @ 24.6.2009, 17:58) Так ведь в...   24.6.2009, 19:23
- - SABROG   Цитата(zss @ 24.6.2009, 20:23) так тут 2 ...   24.6.2009, 19:46
- - zss   Цитата(zss @ 24.6.2009, 20:23) Первичный ...   24.6.2009, 21:36
- - Litkevich Yuriy   А помоему висяк, в том, что есть бесконечный цикл....   24.6.2009, 22:56
- - zss   Цитата(Litkevich Yuriy @ 25.6.2009, 2:56)...   25.6.2009, 7:52


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


7 чел. читают эту тему (гостей: 7, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 19:00