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);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.6.2009, 16:31
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(zss @ 24.6.2009, 17:15) *
поток читает и посылает события. Он проверяет завершение на флаге.
Первичный поток хочет его остановить. Он запускает поток, в котором выставляется флаг и ожидается
завершение читающего потока. Но т.к. обработка событий в первичном потоке, то где-го висяк.
Причем он не всегда.

А для чего такие сложности со вторым останавливающим потоком?

Как мне кажется, тебе нужно сокращать время отклика потока для чтения, т.е. ты флаг остановки установил, этот поток должен завершиться как можно быстрее. Тогда и wait будет отрабатывать быстро, или не использовать wait, а ждать от потока сигнал finised? Тут от твоей задачи зависит.

void readThread()
{
    for(;;)
    {
        if( m_stopped )
            break;
        // read data

        if( m_stopped )
            break;
        QCoreApplication::postEvent(...);

        if( m_stopped )
            break;
        Sleep(1000);
    }
}


Да, на sleep(1000) будет секундная задержка проверки флага. Здесь нужно что то придумать.

Сообщение отредактировал BRE - 24.6.2009, 16:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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:08