Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sancho_s_rancho от Май 19, 2009, 08:55



Название: Выполнение в функции, без использования слота.
Отправлено: Sancho_s_rancho от Май 19, 2009, 08:55
Есть некий класс для общения с девайсом. Вовсю использует сигналы и слоты.
Пример:
Я вызывают метод device::sendCommand(QString str1) и он мне в слот device::answer(QString str2) дает ответ от девайса или ошибку, мол таймаут у меня.
Для меня это не очень удобно. Хочется обойтись одной функцией:
myFunction()
{
sendCommand(QString str1);
waitForAnswer();
//do something
}
Как это грамотно организовать.


Название: Re: Выполнение в функции, без использования слота.
Отправлено: kwisp от Май 19, 2009, 10:24
если действительно этого хотите есть функции

void QTest::qWait ( int ms )   [static]
void QTest::qSleep ( int ms )





Название: Re: Выполнение в функции, без использования слота.
Отправлено: Sancho_s_rancho от Май 19, 2009, 10:27
Это не очень хорошее решение.


Название: Re: Выполнение в функции, без использования слота.
Отправлено: kuzulis от Май 19, 2009, 10:51
1. А под винду или под что программа то?
2. А чем не устраивает обмен через сигналы/слоты?
3. Через что идет обмен с девайсом (сокет, последовательный порт и т.п.) ???


Название: Re: Выполнение в функции, без использования слота.
Отправлено: kuzulis от Май 19, 2009, 10:52
4. Класс - чей наследник???


Название: Re: Выполнение в функции, без использования слота.
Отправлено: Sancho_s_rancho от Май 19, 2009, 12:18
1. А под винду или под что программа то?
2. А чем не устраивает обмен через сигналы/слоты?
3. Через что идет обмен с девайсом (сокет, последовательный порт и т.п.) ???

1. Потенциально Windows/Linux
2. Кода больше и он сложнее.
3. Serial port

Для себя я выход нашел в QxtSignalWaiter  от www.libqxt.org

сигнально-слотный механизм не всегда удобен. Пример:
Я спрашиваю девайс: как тебя зовут?
он мне в течении n msec отвечает:"Прыбор" или таймаут говорит "Беда какая-то".
Если ты "Прыбор", то сделай мне то-то и то-то.

Это все делается в одном методе. Со слотами же получается, что я спрашиваю тут, а отвечают мне где-то там далеко.  Причем отвечают всегда в одном месте, в не зависимости от того, где я спрашиваю.


Название: Re: Выполнение в функции, без использования слота.
Отправлено: kwisp от Май 19, 2009, 12:37
Это не очень хорошее решение.

совершенно согласен.
однако, интересно как организован внутри QxtSignalWaiter?
не утверждаю что через qWait(), просто интересно.


Название: Re: Выполнение в функции, без использования слота.
Отправлено: kuzulis от Май 19, 2009, 13:34
Цитировать
3. Serial port

см. топик : http://www.prog.org.ru/topic_9537_0.html

:)
и мож тогда и подскажете там мне что нибудь :)


Название: Re: Выполнение в функции, без использования слота.
Отправлено: Sancho_s_rancho от Май 20, 2009, 17:36
Это не очень хорошее решение.

совершенно согласен.
однако, интересно как организован внутри QxtSignalWaiter?
не утверждаю что через qWait(), просто интересно.

там QCoreApplication::processEvents() в цикле и таймер, если кому-то надо таймаут.


Название: Re: Выполнение в функции, без использования слота.
Отправлено: kwisp от Май 29, 2009, 15:36
там QCoreApplication::processEvents() в цикле и таймер, если кому-то надо таймаут.
:)

что то типа этого
Код:
namespace QTest
{
    inline static void qWait(int ms)
    {
        Q_ASSERT(QCoreApplication::instance());

        QTime timer;
        timer.start();
        do {
            QCoreApplication::processEvents(QEventLoop::AllEvents, ms);
            QTest::qSleep(10);
        } while (timer.elapsed() < ms);
    }
}


Название: Re: Выполнение в функции, без использования слота.
Отправлено: pastor от Май 29, 2009, 17:19
http://www.prog.org.ru/topic_5140_0.html

Обратите внимание на реализацию с QEventLoop