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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритм наследника QThread ==> (...)  (Прочитано 2273 раз)
zoro86
Гость
« : Сентябрь 08, 2010, 14:30 »

Есть некий наследник от QThread...

Код:
class BillAcceptorNew : public QThread
    {
        Q_OBJECT

    public:
        BillAcceptorNew();
        bool CCNet_init(const QString &com_name, bool enable);
        void CMD_RESET();
        void CMD_WORK();
        int CMD_GET_STATUS();

        static void msleep(int ms)
            {
                QThread::msleep(ms);
            }

    signals:
        void signal_donominal(int cc_poll);
        void CCNet_status_casete();

private slots:
        void slot_read_sts(int sts,const QString &coment);
        void run();

public slots:

        void poll_timer_off();
....


из главного потока я вызываю CMD_WORK();

Код:

void BillAcceptorNew::CMD_WORK()
{

    if(Debuger) qDebug() << "start CMD_WORK";
    //Включаем купюрник на прием денег
    CMD_ANABLE();
    stoped = false;
    poll_timer->start(120);

}

причем имеется соединение...
Код:
connect(poll_timer, SIGNAL(timeout()), this, SLOT(run()));

сам run() делает следующее
Код:
void BillAcceptorNew::run()
{
        qDebug() << "==> send_poll_info";

        CCNet_ack(false);

        this->msleep(20);

        CCNet_poll(true);

        QCoreApplication::processEvents();

}

то есть отправляет запрос и считывает ответ в/из купюраприемника...
..............................................................................................
далее делаю так отключение
Код:
void BillAcceptorNew::poll_timer_off()
{
    poll_timer->stop();
    stoped = true;
    QThread::terminate();
    //Отключаем купюрник
    CMD_DISABLE();
}



так вот все работает нормально...

но процесс csrss который в винде связан с потоками иногда доходит до 30% и главный поток начинает подтармаживать...

так как я первый раз имею дело с потоками объясните как провести оптимизацию??

до этого делал так...

Код:
void run()
{
    while(1==1)
    {
        PollingLoop();//
        QTest::qSleep(200);
        QCoreApplication::processEvents();
    }
}

при этом объекты главного окна совсем зависали(основной поток тормознул???)... а второй поток во всю колбасился...

что посоветуете господа..??
Записан
ilyagoo
Гость
« Ответ #1 : Сентябрь 08, 2010, 19:21 »

все совсем не так.
наследуясь от QThread, нужно переопределить
Код:
virtual void run();
создать объект, затем запустить поток
Код:
QThread::start( Priority );
только после этого Вы получите работающую нить.
функция run() может выглядеть, например, так:
Код:
void MyThread::run()
{
    // если надо, что-нибудь делаем
    doSmthIfAny();
    // запускаем цикл обработки событий
    exec();
}
имея цикл обработки событий, объект нити и все "живущие в нем" смогут принимать сигналы + см. Qt::QueuedConnection, moveToThread( QThread * ) и т.д.
или так:
Код:
void MyThread::run()
{
    while( running )
    {
        // если хотим получать сигналы
        QCoreApplication::processEvents();

        doSmth();

        sleep( someTime );
    }
    // если надо, что-нибудь делаем
    doSmthIfAny();
    // запускаем цикл обработки событий
    exec();
}
Записан
zoro86
Гость
« Ответ #2 : Сентябрь 09, 2010, 06:37 »

Спасибо большое... теперь понял что такое потоки и как их едят... Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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