crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Посылка сигнала из дополнительного потока в главный
AD
  опции профиля:
сообщение 4.6.2009, 10:05
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Есть дополнительный поток, в котором происходит циклическое перемещение прожектора в одной из плоскостей. В этом потоке есть переменная int number_rotate, которая отвечает за количество вращений в цикле. После каждого перемещения она уменьшает свое значение.
Как мне корректно отправить сигнал о том, что переменная изменила значение? И как в основном потоке его поймать?
/// Класс потока - вращение вокруг вертикальной оси заданное количество раз
class HorizontalRotation: public QThread
{
    Q_OBJECT

/// есть и другие переменные и функции конечно же
private:
    int number_rotate;                            ///< количество вращений

protected:
    virtual void run();
};


/// Запуск потока вращения в горизонтальной плоскости
void HorizontalRotation::run()
{
    if(!number_rotate) return;

    int geted_azimuth = VALFROMBYTES(inf_from_ed_packet.high_azim, inf_from_ed_packet.low_azim);
    int azimuth = 172 * 10;                                ///< правый предел прожектора
    if(geted_azimuth < ((172. - 1.5) * 10) || geted_azimuth > ((172. + 1.5) * 10))
    {
        inf_to_ed_packet.low_azim = LOWBYTE(azimuth);
        inf_to_ed_packet.high_azim = HIGHBYTE(azimuth);        ///< перевод в этот предел прожектора
        if(imitTsl) imitTsl -> writeFromCtrlAutoPage();
    }
    readAzimuth(geted_azimuth, 172.);

    /// внешний цикл по количеству перемещений
    const int number_cycles = number_rotate;
    for(register int i=0; i<number_cycles; ++i)
    {
        azimuth = -172 * 10;
        inf_to_ed_packet.low_azim = LOWBYTE(azimuth);
        inf_to_ed_packet.high_azim = HIGHBYTE(azimuth);
        if(imitTsl) imitTsl -> writeFromCtrlAutoPage();
        readAzimuth(geted_azimuth, -172.);

        azimuth = 172 * 10;
        inf_to_ed_packet.low_azim = LOWBYTE(azimuth);
        inf_to_ed_packet.high_azim = HIGHBYTE(azimuth);
        if(imitTsl) imitTsl -> writeFromCtrlAutoPage();
        readAzimuth(geted_azimuth, 172.);
        --number_rotate;
    }

    if(!number_rotate) quit();
}


--number_rotate;
- вот строчка изменения значения переменной.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 4.6.2009, 11:18
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(AD @ 4.6.2009, 12:03) *
сигнал определить в дополнительном потоке, а слот создать в главном? Emit делать в слоте главного потока? А коннект в функции run дополнительного? Все так?
Нет.

псевдокод
class HorizontalRotation: public QThread
{
    Q_OBJECT
    int number_rotate;

protected:
    virtual void run();

signals:
    void displayNR(int);
};

void HorizontalRotation::run()
{
    ....
    emit displayNR(number_rotate); \\ где то в потоке
    ...
}


class Form : public QMainWindow, public Ui::MainWindow
{
    Q_OBJECT

    HorizontalRotation horizontalRotation;
    ....
private slots:
    void displayNR(int number);
    ....
}


Form::Form(QWidget *parent) : QMainWindow(parent)
{
    ....
    connect(&horizontalRotation, SIGNAL(displayNR(int)), SLOT(displayNR(int)));
    ....
}
    
void Form::displayNR(int number)
{
     \\ выполняешь необходимые действия
}


Сообщение отредактировал igor_bogomolov - 4.6.2009, 11:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 8:20