crossplatform.ru

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

> Проблемы с многопотоковым приложением, Работа с второстепенным потоком.
AD
  опции профиля:
сообщение 4.2.2008, 19:23
Сообщение #1


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

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

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




Репутация:   17  


Есть главное приложение, где выполняется отрисовка карты и траектории. А есть второстепенный поток, который читает файлы(логи) для отрисовки траектории. Как правильно передать управление из одной функции в другую? И вообще как правильнее решить этот вопрос. Вот примеры функций.
class LogReader
class LogReader: public QObject
{
    Q_OBJECT

protected:
        std::vector<Uint> m_vBlock;                ///< вектор прочитанных слов
        FILE* file;                                ///< файл загрузки (лог-файл)
    public:
        std::vector<ParamDescr*> rec_descr;        ///< вектор параметров из файла описания (файла загрузки)
        RThread* rthread;                        ///< указатель объект класса потока
        int count_files;                        ///< количество непрочитанных файлов
    protected:
        LOGRECORD ParseBlock();
                void ChangeDateTime(LOGRECORD& t, std::string compared_time, std::string compared_date);
                
                //.............
                std::vector<LOGRECORD> TRead();
                
};

/// Чтение файла загрузки
    vector<LOGRECORD> LogReader::TRead()
    {
        Uint var = (Uint)1E+6;
        bool bBlock = false;
        bool file_read = false;
        vector<LOGRECORD> log;
        time_t before_read;
        time(&before_read);
        while(fread(&var, sizeof(var), 1, file) > 0 && !feof(file))
        {
            Suint adr = var % 256;
            /// Определение начала/конца одной записи и записывание ее в вектор
            switch(adr)
            {
            case 0000:
                m_vBlock.clear();
                bBlock = true;
                break;
            case 0001:
                if(bBlock)
                {
                    LOGRECORD t = ParseBlock();
                    ChangeDateTime(t, "cur_time", "cur_date");
                    log.push_back(t);
                    file_read = true;
                    /// Сравнение временных меток
                    time_t contin_read;
                    time(&contin_read);
                    time_t delta = contin_read - before_read;
                    if(delta > 5)
                    {
                        rthread -> stop();
                        //rthread -> wait(1000);
                    }
                }
                bBlock = false;
                break;
            default:
                if(bBlock)
                    m_vBlock.push_back(var);
            }
        }

        /// Закрываем файл с логом
        ShutDown();
        /// Уменьшаем список непрочитанных файлов
        if(file_read)
        {
            --count_files;
            rthread -> stop();
        }

        return log;
    }

class RThread: public QThread
{
    Q_OBJECT

private:
    enum { MAXRECENTFILES = 7 };
    volatile bool stopped;            ///< переменная, контролирующая начало и конец выполнения потока
    QMutex mutex;                    ///< мьютекс для блокировки данных при работе с ними дополнительного потока

public:
    Reader::LogReader* logger;        ///< объект для чтения логов
    std::vector<LOGRECORD> read_log;///< вектор LOGRECORD , в котором находятся значения из считанного файла

protected:
    void run();

public:
    RThread(): stopped(false) {}
    void stop();
};

/// Запуск дополницельного потока
void RThread::run()
{
    forever
    {
        mutex.lock();
        if(stopped)
        {
            stopped = false;
            mutex.unlock();
            break;
        }
        read_log = logger -> TRead();
        mutex.unlock();
    }
    //QThread::run();
}

/// Остановка дополнительных потоков
void RThread::stop()
{
    mutex.lock();
    stopped = true;
    mutex.unlock();
}


Могу пояснить вопрос. Как вот в этом месте
if(delta > 5)
{
    rthread -> stop();
    //rthread -> wait(1000);
}

Перейти в функцию run()?

Сообщение отредактировал Litkevich Yuriy - 28.8.2008, 13:56
Причина редактирования: Добавлен тэг expand
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ViGOur
  опции профиля:
сообщение 6.2.2008, 13:24
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Ну вот, а я только взялся за рассмотрение твоего кода... :)

Чтобы хоть?

Сообщение отредактировал ViGOur - 6.2.2008, 13:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.2.2008, 13:46
Сообщение #3


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

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

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




Репутация:   17  


Цитата(ViGOur @ 6.2.2008, 13:24) *
Ну вот, а я только взялся за рассмотрение твоего кода... :)

Чтобы хоть?

Что чтобы хоть? А можно из поста удалить зип-файлы? Мне бы не хотелось, чтобы они там валялись. Заранее благодарю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AD22   Проблемы с многопотоковым приложением   4.2.2008, 19:23
- - ViGOur   Если я тебя правильно понял, то rthread->start(...   4.2.2008, 20:06
|- - AD22   Цитата(ViGOur @ 4.2.2008, 20:06) Если я т...   4.2.2008, 20:15
- - ViGOur   Ну с сигналами и слотами все достаточно просто. ...   4.2.2008, 20:32
|- - AD22   Цитата(ViGOur @ 4.2.2008, 20:32) Ну с сиг...   4.2.2008, 20:40
- - ViGOur   Думаю, что в твоем варианте примерно так: class Lo...   4.2.2008, 20:53
|- - AD22   Спасибо за помощь!   5.2.2008, 10:02
|- - AD22   АААА. Еще не все. Сделал. Выдает ошибку - Error...   5.2.2008, 11:35
- - ViGOur   Определение для сигнала не нужно, оно генерируется...   5.2.2008, 11:40
|- - AD22   Цитата(ViGOur @ 5.2.2008, 11:40) Определе...   5.2.2008, 11:46
- - Litkevich Yuriy   Цитата(AD22 @ 5.2.2008, 14:35) Нужно ли т...   5.2.2008, 11:47
|- - AD22   Цитата(Litkevich Yuriy @ 5.2.2008, 11:47)...   5.2.2008, 11:52
- - Litkevich Yuriy   AD22, ты где сигнал посылаешь (emit threadSignal()...   5.2.2008, 12:01
|- - AD22   Цитата(Litkevich Yuriy @ 5.2.2008, 12:01)...   5.2.2008, 12:03
|- - AD22   Теперь ошибка при выполнении. Ломается программа ...   5.2.2008, 12:09
- - Litkevich Yuriy   тема такая, высылать сигнал может только тот класс...   5.2.2008, 12:12
|- - AD22   Цитата(Litkevich Yuriy @ 5.2.2008, 12:12)...   5.2.2008, 12:24
- - ViGOur   Цитата(AD22 @ 5.2.2008, 12:09) connect(th...   5.2.2008, 12:26
- - ViGOur   Цитата(AD22 @ 5.2.2008, 12:24) Ошибку поп...   5.2.2008, 12:27
|- - AD22   Цитата(ViGOur @ 5.2.2008, 12:27) Если она...   5.2.2008, 12:38
|- - AD22   Нет не работает. В смысле, не выводится траектория...   5.2.2008, 19:33
- - Litkevich Yuriy   на то он и форум   5.2.2008, 12:40
- - ViGOur   Цитата(Litkevich Yuriy @ 5.2.2008, 12:40)...   5.2.2008, 12:48
|- - AD22   Понял в чем проблема, но не знаю как выправить. См...   5.2.2008, 13:34
- - ViGOur   Цитата(AD22 @ 5.2.2008, 13:34) а в слоте ...   5.2.2008, 14:38
|- - AD22   Цитата(ViGOur @ 5.2.2008, 14:38) Не понят...   5.2.2008, 15:41
- - ViGOur   приведи код, просто не совсем понятно, что ты хоче...   5.2.2008, 15:56
|- - AD22   Цитата(ViGOur @ 5.2.2008, 15:56) приведи ...   5.2.2008, 16:34
- - ViGOur   А добавить RThread::run работает? void RThread...   5.2.2008, 17:51
- - ViGOur   Слушай можешь выложить исходники с файлом который ...   6.2.2008, 9:56
|- - AD22   Цитата(ViGOur @ 6.2.2008, 9:56) Слушай мо...   6.2.2008, 10:04
|- - AD22   Вот файлы. При выполнении предлагается выбрать вна...   6.2.2008, 10:11
|- - AD22   Проблема вроде бы решена. ВСЕМ СПАСИБО! Если б...   6.2.2008, 13:18
- - ViGOur   Ну вот, а я только взялся за рассмотрение твоего к...   6.2.2008, 13:24
|- - AD22   Цитата(ViGOur @ 6.2.2008, 13:24) Ну вот, ...   6.2.2008, 13:46
- - Admin   Цитата(AD22 @ 6.2.2008, 13:46) А можно из...   6.2.2008, 14:55
|- - AD22   Цитата(Admin @ 6.2.2008, 14:55) Удалил......   6.2.2008, 15:36
- - ViGOur   Цитата(AD22 @ 6.2.2008, 13:46) Что чтобы ...   6.2.2008, 16:26
|- - AD22   Цитата(ViGOur @ 6.2.2008, 16:26) Очепятал...   6.2.2008, 16:33
|- - AD22   Вопрос на будущее. Мне пришлось "убивать...   6.2.2008, 17:17
- - terrible   void QThread::quit() или void QThread::exit ( int...   6.2.2008, 17:33
|- - AD22   Цитата(terrible @ 6.2.2008, 17:33) void Q...   6.2.2008, 17:36
- - ViGOur   просто вызвать   6.2.2008, 17:43
|- - AD   У меня есть огромная просьба: проблема, которая об...   28.8.2008, 13:42
- - ViGOur   Ты просто по всей видимости не доконца понимаешь к...   28.8.2008, 13:48
- - AD   Цитата(ViGOur @ 28.8.2008, 14:48) Ты прос...   28.8.2008, 14:19


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


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




RSS Текстовая версия Сейчас: 28.3.2024, 16:04