Russian Qt Forum

Qt => Общие вопросы => Тема начата: zoro86 от Апрель 06, 2010, 14:47



Название: Прога зависает помогите...
Отправлено: 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...
там при вызове данного метода прога зависает... понятно что там цикл похож на бесконечный ;) и все такое... так вот как этот метод запустить из главного окна как бы отдельно... в отдельном типа процессе... или потоке...???


Название: Re: Прога зависает помогите...
Отправлено: Friar от Апрель 06, 2010, 14:51
Ну можно для начала поставить в цикл QCoreApplication::processEvents();, тогда будет интерфейс отрисовываться. А лучше сделать в отдельном потоке, смотрите QThread. Наследуетесь от QThread, переопределяете run(), в нем будете получать статус купюрника, а сигналами сообщать основному окну всю необходимую информацию. Ну еще пару слотов для вкл/выкл приема банкнот. И кстати для купюрника можно sleep(который в цикле) поставить и 500, имхо.


Название: Re: Прога зависает помогите...
Отправлено: zoro86 от Апрель 06, 2010, 15:13
по поводу sleep-a там по документации от 100 - 200 сказано ставить :-[ ..

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

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

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



Название: Re: Прога зависает помогите...
Отправлено: Friar от Апрель 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();
соответственно к сигналам прицепите свои слоты. Вот как-то так...


Название: Re: Прога зависает помогите...
Отправлено: whirlwind от Апрель 06, 2010, 18:01
хм, вот это не Qt-way
Код:
    do
    {
        cmd_sleep(120);
        cc_poll = CMD_POLL();

    }while(cc_poll == 0);


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


Название: Re: Прога зависает помогите...
Отправлено: zoro86 от Апрель 07, 2010, 06:11
Спасибо мужики .... буду катать ;)


Название: Re: Прога зависает помогите...
Отправлено: Friar от Апрель 07, 2010, 07:49
хм, вот это не Qt-way
Код:
    do
    {
        cmd_sleep(120);
        cc_poll = CMD_POLL();

    }while(cc_poll == 0);


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


Для описаной задачи, все таки лучший вариант QThread, дальше будет проще добавить функционал, просто сам работал с купюрниками!


Название: Re: Прога зависает помогите...
Отправлено: zoro86 от Апрель 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;
}

то есть какую лучше использовать...??


Название: Re: Прога зависает помогите...
Отправлено: SASA от Апрель 07, 2010, 11:48
Вот вопросик возник чем отличается QTest::qSleep(200); от вот этой функции...

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


Название: Re: Прога зависает помогите...
Отправлено: Friar от Апрель 07, 2010, 14:57
Вот вопросик возник чем отличается QTest::qSleep(200); от вот этой функции...

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

там еще есть wait() которая не будет тормозить, но как говорил выше QThread тут очень кстати.