Russian Qt Forum
Октябрь 01, 2024, 12:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выполнение в функции, без использования слота.  (Прочитано 6015 раз)
Sancho_s_rancho
Гость
« : Май 19, 2009, 08:55 »

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

если действительно этого хотите есть функции

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



Записан
Sancho_s_rancho
Гость
« Ответ #2 : Май 19, 2009, 10:27 »

Это не очень хорошее решение.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Май 19, 2009, 10:51 »

1. А под винду или под что программа то?
2. А чем не устраивает обмен через сигналы/слоты?
3. Через что идет обмен с девайсом (сокет, последовательный порт и т.п.) Непонимающий
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Май 19, 2009, 10:52 »

4. Класс - чей наследник???
Записан

ArchLinux x86_64 / Win10 64 bit
Sancho_s_rancho
Гость
« Ответ #5 : Май 19, 2009, 12:18 »

1. А под винду или под что программа то?
2. А чем не устраивает обмен через сигналы/слоты?
3. Через что идет обмен с девайсом (сокет, последовательный порт и т.п.) Непонимающий

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

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

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

Это все делается в одном методе. Со слотами же получается, что я спрашиваю тут, а отвечают мне где-то там далеко.  Причем отвечают всегда в одном месте, в не зависимости от того, где я спрашиваю.
Записан
kwisp
Гость
« Ответ #6 : Май 19, 2009, 12:37 »

Это не очень хорошее решение.

совершенно согласен.
однако, интересно как организован внутри QxtSignalWaiter?
не утверждаю что через qWait(), просто интересно.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Май 19, 2009, 13:34 »

Цитировать
3. Serial port

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

Улыбающийся
и мож тогда и подскажете там мне что нибудь Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Sancho_s_rancho
Гость
« Ответ #8 : Май 20, 2009, 17:36 »

Это не очень хорошее решение.

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

там QCoreApplication::processEvents() в цикле и таймер, если кому-то надо таймаут.
Записан
kwisp
Гость
« Ответ #9 : Май 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);
    }
}
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Май 29, 2009, 17:19 »

http://www.prog.org.ru/topic_5140_0.html

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.