Russian Qt Forum
Ноябрь 22, 2024, 21:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Объясните пожалуйста)  (Прочитано 13463 раз)
alexeev
Гость
« : Ноябрь 20, 2013, 14:01 »

Есть класс
Код:
class cStorage: public QObject
{
public:
    cStorage();
    ~cStorage();
    void Write(QByteArray Package);
};

В дргуом классе создаю обект, поток,  переношу объект в поток, стартую поток

Код:
Storage = new cStorage();
QThread *thread = new QThread();
Storage->moveToThread(thread);
thread->start();


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

Код:
 Storage->Write(Package);

Он вызывается в главном потоке а не в созданном мной? Почему так? Разве перенося объект, все его методы не будут выполняться в новом потоки? Или влияет то, что этот метод я вызываю из главного потока? Помогите разобраться пожалуйста=)
« Последнее редактирование: Ноябрь 20, 2013, 14:08 от alexeev » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Ноябрь 20, 2013, 14:11 »

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

Сделайте из Write слот и вызывайте его с помощью сигнала, тогда он будет выполняться в своей нитке.
Записан
alexeev
Гость
« Ответ #2 : Ноябрь 20, 2013, 14:13 »

Сделайте из Write слот и вызывайте его с помощью сигнала, тогда он будет выполняться в своей нитке.

Можно поподробнее, что-то ничего не понял(
Записан
alexeev
Гость
« Ответ #3 : Ноябрь 20, 2013, 14:14 »

Т.е вместо метода сделать слот, а на месте вызова, вызвать сигнал?
Записан
Bepec
Гость
« Ответ #4 : Ноябрь 20, 2013, 14:30 »

Почитай про сигнал-слоты.

Да, вместо метода делаешь слот. Вместо вызова делаешь сигнал. И не забудь указать тип соединения при connect'e.
Записан
alexeev
Гость
« Ответ #5 : Ноябрь 20, 2013, 14:33 »

Тогда понятно, щас попробую.
Qt::QueuedConnection, а зачем указывать, если в документации написано, Qt::AutoConnection   0 (по умолчанию) Тоже самое, что и DirectConnection, если источник и получатель находятся в одном и том же потоке. Тоже самое, что и QueuedConnection, если источник и получатель находятся в разных потоках. Вроде по умолчанию тоже све ок должно быть
Записан
alexeev
Гость
« Ответ #6 : Ноябрь 20, 2013, 14:45 »

Сделал, и укзал тип соедиенния, сигнал исходит, но переход в слот не идет, подскажиет пожалуйста почему?)

коннект так пропсиал

Код:
 Storage = new cStorage();
    QThread *thread = new QThread();
    Storage->moveToThread(thread);
    
    thread->start();

    connect(this,SIGNAL(SignalWriteToStorage(QByteArray)),Storage,SLOT(Write(QByteArray)),Qt::QueuedConnection);

« Последнее редактирование: Ноябрь 20, 2013, 14:48 от alexeev » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Ноябрь 20, 2013, 14:53 »

Теперь осталось этот сигнал (SignalWriteToStorage) инициировать. Улыбающийся
Записан
_OLEGator_
Гость
« Ответ #8 : Ноябрь 20, 2013, 14:53 »

и макрос Q_OBJECT нужен, чтобы сигнал-слотовый механизм работал.
Записан
alexeev
Гость
« Ответ #9 : Ноябрь 20, 2013, 14:54 »

Инициировал, и макрос добавил, это я все понимаю прекрасно
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Ноябрь 20, 2013, 14:58 »

Инициировал, и макрос добавил, это я все понимаю прекрасно
Показывайте весь код, должен вызываться. И еще вопрос, в консоль что нибудь пишется при выполнении программы?
Наверное проще это делать через QMetaObject::invokeMethod.
Записан
alexeev
Гость
« Ответ #11 : Ноябрь 20, 2013, 14:59 »

Да, простите, в классе Storage не было макроса, не знаю как мог забыть =(
Но к сожалению все это не решило моей проблемы, такое ощущение, что все равно выполнятеся в одном потоке(
Я логирую данные от внешнего устройства, и если я зажимаю окно, запись в файл прекращается ( а данные терять нельзя), в связи с этим было прияно решение создать новый поток, и преместить туда объект отвечающий за логирование. Как думаете почему может не работать?
« Последнее редактирование: Ноябрь 20, 2013, 15:00 от alexeev » Записан
Bepec
Гость
« Ответ #12 : Ноябрь 20, 2013, 15:01 »

Если не соединяется, будет "ай ай ай" в дебажном выводе.
Если у вас в threde не запущен цикл обработки событий, ничего и не придёт.

Показывайте код, поможем.
Не показывайте код, не поможем. Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Ноябрь 20, 2013, 15:02 »

и если я зажимаю окно
Не венда ли часом?
Записан
alexeev
Гость
« Ответ #14 : Ноябрь 20, 2013, 15:04 »

Она самая, но проект будет использоваться под linux скорее всего
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 22.