crossplatform.ru

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

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


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

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

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




Репутация:   94  


Цитата(AD22 @ 5.2.2008, 14:35) *
Нужно ли тело для threadSignal()?

Из книжки Макса Шлее:
Цитата
Сигналы определяются в классе, как и обычные методы, только без реализации. С точки зрения программиста они являются только протатипами методов, содержащихся в заголовочном файле определения класса


к стати у Шлее написано еще так:
Цитата
...не имеет смысла определять сигналы как protected, private, public


Сообщение отредактировал Litkevich Yuriy - 5.2.2008, 11:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 11:52
Сообщение #12


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 5.2.2008, 11:47) *
Из книжки Макса Шлее:
Цитата
Сигналы определяются в классе, как и обычные методы, только без реализации. С точки зрения программиста они являются только протатипами методов, содержащихся в заголовочном файле определения класса


Спасибо. Я использую книжку
Жасмин Бланшет, Марк Саммерфилд
"Qt 4: Программирование GUI на C++"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.2.2008, 12:01
Сообщение #13


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

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

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




Репутация:   94  


AD22, ты где сигнал посылаешь (emit threadSignal()) можешь пример привести?

Сообщение отредактировал Litkevich Yuriy - 5.2.2008, 12:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 12:03
Сообщение #14


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 5.2.2008, 12:01) *
AD22, ты где сигнал посылаешь (emit threadSignal()) можешь пример привести?

Конечно! :)
vector<LOGRECORD> LogReader::TRead()
    {
        //......................
        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);
            }
        }

        //..................
        return log;
    }


На счет protected, private, public - да, в этом была ошибка - убрал!

Сообщение отредактировал AD22 - 5.2.2008, 12:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 12:09
Сообщение #15


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

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

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




Репутация:   17  


Теперь ошибка при выполнении. Ломается программа на строчках:
LogReader::LogReader(std::string FileName)
    {
        fopen_s(&file, FileName.c_str(), "rb");
        connect(this, SIGNAL(threadSignal()), rthread, SLOT(threadSlot()));
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.2.2008, 12:12
Сообщение #16


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

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

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




Репутация:   94  


тема такая, высылать сигнал может только тот класс в котором сигнал определен, я так понял что он у тебя в другом классе, тогда сделай так:
class LogReader: public QObject
{
   // ...
   LogReader();

protected signals:
   void threadSignal();

public:
   void sendMySignal()
   {
     emit threadSignal();
    }

   // ...
};


а в коде где ты делал emit threadSignal(); вызывай метод sendMySignal()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 12:24
Сообщение #17


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 5.2.2008, 12:12) *
тема такая, высылать сигнал может только тот класс в котором сигнал определен, я так понял что он у тебя в другом классе, тогда сделай так:
class LogReader: public QObject
{
   // ...
   LogReader();

protected signals:
   void threadSignal();

public:
   void sendMySignal()
   {
     emit threadSignal();
    }

   // ...
};


а в коде где ты делал emit threadSignal(); вызывай метод sendMySignal()

Проблема была не в этом. Я в конструкторе делал connect, а в этот момент rthread был еще не инициализирован. Ошибку поправил, но все-равно траектория не выводится, хотя работает приложение быстро и без ошибок выполнения! :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.2.2008, 12:26
Сообщение #18


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

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

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




Репутация:   40  


Цитата(AD22 @ 5.2.2008, 12:09) *
connect(this, SIGNAL(threadSignal()), rthread, SLOT(threadSlot()));
А rthread у тебя валидный? Думаю, что нет, потому и валится...

Цитата(Litkevich Yuriy @ 5.2.2008, 12:12) *
я так понял что он у тебя в другом классе
Если он сделал так как я показал, то в том классе, что нужно, в LogReader. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 5.2.2008, 12:27
Сообщение #19


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

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

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




Репутация:   40  


Цитата(AD22 @ 5.2.2008, 12:24) *
Ошибку поправил, но все-равно траектория не выводится, хотя работает приложение быстро и без ошибок выполнения! sad.gif
Если она у тебя должна выводиться в слоте, то поставь в нем точку останова и посмотри, правильно отрабатывает ли...

Сообщение отредактировал ViGOur - 5.2.2008, 12:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 12:38
Сообщение #20


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

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

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




Репутация:   17  


Цитата(ViGOur @ 5.2.2008, 12:27) *
Если она у тебя должна выводиться в слоте, то поставь в нем точку останова и посмотри, правильно отрабатывает ли...

Да... она не отрабатывает. Я сделал так, как Вы и показывали. Спасибо за оперативную и продуктивную помощь. Буду разбираться с проблемами. Если что, могу вопросы задавать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 18.4.2024, 12:15