crossplatform.ru

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

5 страниц V  < 1 2 3 4 5 >  
Ответить в данную темуНачать новую тему
> Проблемы с многопотоковым приложением, Работа с второстепенным потоком.
Litkevich Yuriy
  опции профиля:
сообщение 5.2.2008, 12:40
Сообщение #21


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


на то он и форум ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.2.2008, 12:48
Сообщение #22


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

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

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




Репутация:   40  


Цитата(Litkevich Yuriy @ 5.2.2008, 12:40) *
на то он и форум wink.gif
Именно. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 13:34
Сообщение #23


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

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

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




Репутация:   17  


Понял в чем проблема, но не знаю как выправить.
Смысл такой в функции LogReader::TRead() в месте вызова сигнала я хочу, чтобы в вектор read_log добавлялись считанные значения, а в слоте я опять же обращаюсь к функции TRead() для того, чтобы вернуть этот вектор. Как это сделать, подскажите, пожалуйста!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.2.2008, 14:38
Сообщение #24


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

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

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




Репутация:   40  


Цитата(AD22 @ 5.2.2008, 13:34) *
а в слоте я опять же обращаюсь к функции TRead() для того, чтобы вернуть этот вектор
Не понятно, зачем тебе из слота обращаться к функции TRead()?
Когда можно сделать так, заполняешь вектор read_log в LogReader::TRead(), после заполнения отправляешь сигнал, в слоте получаешь вектор read_log и читаешь его. :
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 15:41
Сообщение #25


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

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

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




Репутация:   17  


Цитата(ViGOur @ 5.2.2008, 14:38) *
Не понятно, зачем тебе из слота обращаться к функции TRead()?
Когда можно сделать так, заполняешь вектор read_log в LogReader::TRead(), после заполнения отправляешь сигнал, в слоте получаешь вектор read_log и читаешь его. :

Так ведь в слоте я и получаю вектор структур LOGRECORD!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.2.2008, 15:56
Сообщение #26


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

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

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




Репутация:   40  


приведи код, просто не совсем понятно, что ты хочешь. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 16:34
Сообщение #27


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

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

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




Репутация:   17  


Цитата(ViGOur @ 5.2.2008, 15:56) *
приведи код, просто не совсем понятно, что ты хочешь. :)

Вот код, который сделан со всеми Вашими поправками.
/// Чтение файла загрузки
    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)
                        emit threadSignal();*/
                }
                bBlock = false;
                break;
            default:
                if(bBlock)
                    m_vBlock.push_back(var);
            }
        }

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

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

/// Слот, в который попадаем в момент чтения лог-файла
void RThread::threadSlot()
{
    mutex.lock();
    read_log = logger -> TRead();
    mutex.unlock();
}

В этом варианте все-равно не работает.
А мне бы хотелось, чтобы в момент
time_t contin_read;
time(&contin_read);
time_t delta = contin_read - before_read;
if(delta > 5)
        emit threadSignal();

передавались считанные данные в read_log!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.2.2008, 17:51
Сообщение #28


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

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

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




Репутация:   40  


А добавить RThread::run работает?
void RThread::run()
{
   // ...

  exec();
}
Насчет остального не могу сейчас сказать, так как голова совсем уже не соображает. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 19:33
Сообщение #29


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

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

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




Репутация:   17  


Нет не работает. В смысле, не выводится траектория!!! Буду благодарен за любой дельный совет. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 6.2.2008, 9:56
Сообщение #30


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

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

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




Репутация:   40  


Слушай можешь выложить исходники с файлом который ты читаешь в архиве, я полностью гляну, что у тебя и как там?
А то вопросов слишком много... :)

И в кратце обьясни, что есть, что нужно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

5 страниц V  < 1 2 3 4 5 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 9.7.2020, 7:59