Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, Организация потоков 
:(
    Опции темы
alexeev
Дата 27.11.2012, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.11.2012

Репутация: нет
Всего: нет



Здравствуйте, возникла слдеующая проблема...
Моя программа, прошивает плату по com порту, отправляя определенные пакеты, и если в момент прошивки, зажать главное окно или начать его передвигать по рабочему столу, прошивка останавливается, и отменяется платой т.к за определнное время не поступил нужный пакет.
В связи с этим возник вопрос как это лучше реализовать?
Есть варинат сделать два потока - один будет отвечать за gui (главный виджет который выводит информацию от других классов), и второй, который занимается сборкой и отсылкой пакета.
Есть ли ещё какие-нибудь варианты?

Много почитал, про потоки, но полной ясности так и нет) Есть не плохой пример в examples (Mandelbrot), там нечто похожее реализовано, но что-то всё равно не совсем ясно. Может подскажите что-то ещё, возможно на более простом примере. 

Для лучшего понимания решил попробывать написать простую программу, котрая считывает каждую секунду число из файла, и отправляет в главный класс, который выводит все на форму в техтэдит. При зажимании мышкой окна, зависание происходит не сильное, но думаю если организовать все через потоки, его вообще не будет. Не могли бы Вы пояснить, на таком простом примере, как это лучше организовать.
Заранее спасибо=)
PM MAIL   Вверх
borisbn
Дата 27.11.2012, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Однозначно нужен доп.поток.
Код
class LoaderThread : public QThread {
Q_OBJECT
public:
    ~LoaderThread() { wait(); }
    void start( const std::vector< unsigned char > & data ) {
        wait(); // типа дождаться окончания пред. вызова. М.б. это и не надо... хз.
        m_data.assign( data.start(), data.end() );
        QThread::start();
    }

signals:
    void onProgress( int percents );
private:
    std::vector< unsigned char > m_data;

protected:
    void run() {
        int dataSize = m_data.size();
        int prevPercent = -1;
        for ( int i = 0; i < dataSize; i++ ) {
            // вызов ф-ции загрузки очередного байта
            loadToCOM( m_data[ i ] );
            int percent = i / (double)dataSize * 100;
            if ( percent != prevPercent ) {
                prevPercent = percent;
                emit onProgress( percent );
            }
        }
    }
};

class Gui : public QWidget {
...
    LoaderThread m_thread;

   Gui() {
       connect( & m_thread, SIGNAL( onProgress( int ) ), SLOT( onProgress( int ) ) );
   }

    void onNeedLoad( const std::vector< unsigned char > & data ) {
        m_thread.start( data );
    }
private slots:
    void onProgress( int percents ) {
        // ну... здесь, думаю, понятно, что нужно делать
    }
};



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kuzulis
Дата 27.11.2012, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

Не могли бы Вы пояснить, на таком простом примере, как это лучше организовать.


QtSerialPort без всяких потоков, см. пример /terminal (хотя нужно проверить).

Или, если не будет получаться - то пример /blockingmaster, он "потоковый".


Это сообщение отредактировал(а) kuzulis - 27.11.2012, 18:31
PM MAIL   Вверх
alexeev
Дата 28.11.2012, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.11.2012

Репутация: нет
Всего: нет



Цитата

QtSerialPort без всяких потоков, см. пример /terminal (хотя нужно проверить).


Не очень понял, что Вы имели в виду, я испольую сериал порт, и с ним проблем не возникает, если не трогать главное окошко, интерфейс гуи зависать не будет, и все работает без проблем.

borisbn, спасибо, щас буду разбираться=)
PM MAIL   Вверх
kuzulis
Дата 28.11.2012, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

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

А я тут не очень понял. 

Что вы используете: Самописный класс или прямые вызовы WinAPI (потому что проблема с окошком и 
остановкой обработки событий имеется только в Win - это ее проблема), QtSerialPort или другие библиотеки?

Я вам дал ссылку на использование примера  /blockingmaster из QtSerialPort, в котором используются треды,
там проблемы с остановкой евентов не должно быть.
PM MAIL   Вверх
alexeev
Дата 28.11.2012, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.11.2012

Репутация: нет
Всего: нет



Я использую QSerialPort. А пример я не могу такой найти=(
Возвращаясь к потокам, подскажите пожалуйста, что я делаю неправильно?


Есть класс Xmodem, который отправляет данные для вывода в класс потока (символ пришедший с COM):
Код

emit Signal_show_data(QString(Ga));


В классе потока я его принимаю (Connect прописан в главном классе окна, код привед ниже) и отправляю в gui
Код

class CComTread : public QThread
{
    Q_OBJECT

public:
    CComTread();
    ~CComTread();
signals:
    void signal_send_result(QString);
public slots:
    void slot_receive_value(QString);
CComTread::CComTread()
{
    moveToThread(this);

}

CComTread::~CComTread()
{

}

void CComTread::slot_receive_value(QString name)
{
    emit signal_send_result(name);
}
};




Класс главного окна:

Код

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
....................
CComTread *Thread1 = new CComTread();
connect(XModem,SIGNAL(Signal_show_data(QString)),Thread1,SLOT(slot_receive_value(QString)));
connect(Thread1,SIGNAL(signal_send_result(QString)),this,SLOT(Slot_show_data_from_XModem(QString)));
 Thread1->start();
.......................

}

void Widget::Slot_show_data_from_XModem(QString a)
{
    TextEdit_XModem->clear();
    TextEdit_XModem->append(a);
}



Но при зажатии окна, данные останавливаются и не дописываются своевременно по мере прихода в техтэдит

Это сообщение отредактировал(а) alexeev - 28.11.2012, 14:55
PM MAIL   Вверх
kuzulis
Дата 28.11.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

Я использую QSerialPort. А пример я не могу такой найти=(


Внимательнее прочти то, что я написал и сходи, наконец, по той ссылке что я привел,
наверное я не зря писал QtSerialPort а не QSerialPort?  smile 
PM MAIL   Вверх
alexeev
Дата 28.11.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.11.2012

Репутация: нет
Всего: нет



Я пользуюсь, этим же классом, при наобре сообщение t случайно пропустил.
Тут дело совсем не в классе сериал порта.
PM MAIL   Вверх
kuzulis
Дата 28.11.2012, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

А пример я не могу такой найти


Но он там есть (с)


PM MAIL   Вверх
borisbn
Дата 28.11.2012, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(alexeev @  28.11.2012,  14:54 Найти цитируемый пост)
Но при зажатии окна, данные останавливаются и не дописываются своевременно по мере прихода в техтэдит

а вот с этим, пожалуй, ничего не поделаешь. Тут поток не поможет. Из доп.потока нельзя напрямую обращаться к элементам GUI. Только через сигнал/слот. Такое обращение не рисует в техтэдите, а ставит сообщение о том, что нужно что-то дорисовать, в очередь. В эту же очередь складываются сообщения от мыши, клавиатуры и пр.

Цитата(alexeev @  28.11.2012,  14:54 Найти цитируемый пост)
connect(XModem,SIGNAL(Signal_show_data(QString)),Thread1,SLOT(slot_receive_value(QString)));
connect(Thread1,SIGNAL(signal_send_result(QString)),this,SLOT(Slot_show_data_from_XModem(QString)));

а это зачем ? почему не приконнектить сигнал от XModem к слоту this ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.