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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прога зависает помогите...  (Прочитано 4803 раз)
zoro86
Гость
« : Апрель 06, 2010, 14:47 »

Тут такая проблема ...

В общем есть некий класс для работы с купюраприемником, в нем реализован метод типа :

Код:
bool BillAcceptor::CMD_WORK()
{
    if(Debuger) qDebug() << "start CMD_WORK";
    int cc_poll = 0;
    cmd_sleep(100);
    CMD_ANABLE();
    do
    {
        cmd_sleep(120);
        cc_poll = CMD_POLL();

    }while(cc_poll == 0);

    if(Debuger) qDebug() << "+++++++++++++++++++++++++++++++++++";
    QString denomic = QString("Validator Input %1 ").arg(cc_poll);
    if(Debuger) qDebug() << denomic;
    if(Debuger) qDebug() << "+++++++++++++++++++++++++++++++++++";

    emit signal_donominal(cc_poll);

    cmd_sleep(100);

    CMD_DISABLE();

    if(Debuger) qDebug() << "end CMD_WORK";
    return true;
}
данный метод опрашивает купюрник на наличие введенных купюр.
ну вроде как в отдельной консоли... у меня все нормально работает..

подключаю класс в главное GUI окно MainWindow...
там при вызове данного метода прога зависает... понятно что там цикл похож на бесконечный Подмигивающий и все такое... так вот как этот метод запустить из главного окна как бы отдельно... в отдельном типа процессе... или потоке...Непонимающий
Записан
Friar
Гость
« Ответ #1 : Апрель 06, 2010, 14:51 »

Ну можно для начала поставить в цикл QCoreApplication::processEvents();, тогда будет интерфейс отрисовываться. А лучше сделать в отдельном потоке, смотрите QThread. Наследуетесь от QThread, переопределяете run(), в нем будете получать статус купюрника, а сигналами сообщать основному окну всю необходимую информацию. Ну еще пару слотов для вкл/выкл приема банкнот. И кстати для купюрника можно sleep(который в цикле) поставить и 500, имхо.
« Последнее редактирование: Апрель 06, 2010, 14:59 от Friar » Записан
zoro86
Гость
« Ответ #2 : Апрель 06, 2010, 15:13 »

по поводу sleep-a там по документации от 100 - 200 сказано ставить Обеспокоенный ..

в данный момент у меня пока так идет..
Код:
class BillAcceptor : public QObject
    {
        Q_OBJECT

    public:
        BillAcceptor();....
Вы предлогаете от QThread наследоваться типа class BillAcceptor : public QThread .... а дальше пошло поехало...

а как там логика будет выглядеть... построения можно по подробнее..

Записан
Friar
Гость
« Ответ #3 : Апрель 06, 2010, 15:21 »

Код:
class BillAcceptor : public QThread
    {
        Q_OBJECT

    public:
        BillAcceptor();
        run();
    signals:
        void billStacked(qint32 nominal);
        void billStackOpen(bool isOpen);
};

void run()
{
    while(1==1)
    {
        PollingLoop();//тут делаете то что вам надо
        QTest::qSleep(200);
        QCoreApplication::processEvents();
    }
}
Затем в где-то в коде
Код:
BillAcceptor *ba = new BillAcceptor();
ba->start();
соответственно к сигналам прицепите свои слоты. Вот как-то так...
Записан
whirlwind
Гость
« Ответ #4 : Апрель 06, 2010, 18:01 »

хм, вот это не Qt-way
Код:
    do
    {
        cmd_sleep(120);
        cc_poll = CMD_POLL();

    }while(cc_poll == 0);


Как по-моему, правильно было бы сделать обьект со слотом CMD_POLL() и этот слот дергать таймером(QTimer)
 
Записан
zoro86
Гость
« Ответ #5 : Апрель 07, 2010, 06:11 »

Спасибо мужики .... буду катать Подмигивающий
Записан
Friar
Гость
« Ответ #6 : Апрель 07, 2010, 07:49 »

хм, вот это не Qt-way
Код:
    do
    {
        cmd_sleep(120);
        cc_poll = CMD_POLL();

    }while(cc_poll == 0);


Как по-моему, правильно было бы сделать обьект со слотом CMD_POLL() и этот слот дергать таймером(QTimer)
 


Для описаной задачи, все таки лучший вариант QThread, дальше будет проще добавить функционал, просто сам работал с купюрниками!
Записан
zoro86
Гость
« Ответ #7 : Апрель 07, 2010, 09:15 »

Пока пришлось реализовать через QTimer... так как время поджимает... вторую версию надеюсь более грамотно накатаю...

Вот вопросик возник чем отличается QTest::qSleep(200); от вот этой функции...
Код:
bool BillAcceptor::cmd_sleep(int timer)
{
    QMutex theLock;
    theLock.lock();
    QWaitCondition waitCondition;
    waitCondition.wait(&theLock, timer);
    theLock.unlock();
    return true;
}

то есть какую лучше использовать...??
Записан
SASA
Гость
« Ответ #8 : Апрель 07, 2010, 11:48 »

Вот вопросик возник чем отличается QTest::qSleep(200); от вот этой функции...

QTest::qSleep() - функция из библиотеки QTest. И используется для "моделирования" задержек между действиями. И должна использоваться в тестах.
Если вы отнаследуетесь от QThread, то станет возможным использовать функцию sleep().
А тормазить главный поток это не есть гуд, ИХМО.
Записан
Friar
Гость
« Ответ #9 : Апрель 07, 2010, 14:57 »

Вот вопросик возник чем отличается QTest::qSleep(200); от вот этой функции...

QTest::qSleep() - функция из библиотеки QTest. И используется для "моделирования" задержек между действиями. И должна использоваться в тестах.
Если вы отнаследуетесь от QThread, то станет возможным использовать функцию sleep().
А тормазить главный поток это не есть гуд, ИХМО.

там еще есть wait() которая не будет тормозить, но как говорил выше QThread тут очень кстати.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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