Название: Потоки Отправлено: bigory от Октябрь 23, 2010, 13:56 Всем доброе время суток.
Я создал диалоговое окно, в него поместил только один элемент Label. Мне нужно получить нужную мне информацию и передать ее в Label. Вопрос состоит в том, как из потока класса MyThread передать значение в Label, которая находиться в классе Dialog? Вот код заголовочного файла: Код: #ifndef DIALOG_H Вот код Основного файла: Код: #include "dialog.h" Название: Re: Потоки Отправлено: merke от Октябрь 23, 2010, 14:41 Используй технологию сигналов слотов!
Т.е. в потоке делай например emit messaga("HI"); А когда в диалоге создаешь объект потока, соединяй сигнал messaga потока со слотом в классе диалога например, Код: connect(mythread, SIGNAL(messaga()), this, SLOT(setMessageToLabel())); И все теперь поток и диалог связаны посредством сигналов и слотов, как только в потоке испускается сигнал messaga в параметре несущий твое сообщение, оно будет передано в слот setMessageToLabel() В слоте реализуй вывод сообщения в лэйбл. Название: Re: Потоки Отправлено: merke от Октябрь 23, 2010, 14:44 То какой ты показал код это ужас на улице вязов! ;D
Почитай книжки по Qt. ;) Название: Re: Потоки Отправлено: bigory от Октябрь 23, 2010, 15:00 Извините, но я вообще ничего не понял...:(
Значит ситуация такая, это диалоговое окно я вызываю через основное окно. Мне нужно создать поток только потому, что в диалоговом окне есть функция get(), которая требует некоторое время для выполнения (В примере я заменил на простенькие операции чтоб не заморачиваться этим голову). Если ее запускать без потока, то приходится ждать появление окна, а так появиться окно с просьбой подождать. Если там действительно надо использовать сигнал слотов, то хотелось бы по подробнее Название: Re: Потоки Отправлено: merke от Октябрь 23, 2010, 15:17 О ужас как все сложно вы реализовали. Подумайте, есть более рациональное и простое решение данной задачи!
Название: Re: Потоки Отправлено: bigory от Октябрь 23, 2010, 15:29 Похоже без моей заготовки я не смогу решить проблему
Вот мой исходник http://file.qip.ru/file/d77nvSAd/Admin.html ( 4.58 Kb ) Если в диалоговом окне стереть все что связано с потоком и стереть /* и */, то все заработает как надо, но тогда будет долго появляться окно. Там же та проблема, которую я пытаюсь решить в другом топике (про таблицу), мне нужно разместить таблицу на начало координат, а не на 9х9. Название: Re: Потоки Отправлено: Alex Custov от Октябрь 23, 2010, 15:51 потоки тут не нужны. Используй сигналы от QNetworkAccessManager, это позволит строить асинхронный интерфейс (в Qt так принято). Более того, станет возможным добавить какую-нибудь кнпоку типа "Cancel", а при синхронном выполнении это будет нереально.
Название: Re: Потоки Отправлено: bigory от Октябрь 23, 2010, 16:45 Из-за ожидания отклика сигнала не будет тормозить появление окна?
Функция get() очень долго выполняется. Я хочу чтобы диалоговое окно появилось сразу, а уже как выполниться get(), появиться нужная информация. Не будет ли задерживаться появление окна из-за ожидания сигнала? Название: Re: Потоки Отправлено: bigory от Октябрь 23, 2010, 17:09 Просматривал статьи по QNetworkAccessManager, везде говориться как работать с интернетом, но мне этого не нужно. Не могу понять как это можно связать с моей программой
Название: Re: Потоки Отправлено: Alex Custov от Октябрь 23, 2010, 18:28 Из-за ожидания отклика сигнала не будет тормозить появление окна? Ещё раз - get() у тебя синхронный. Это нужно переделать на асинхронность. Сигнал finished() у QNetworkReply (я сперва написал неправильно) соединяй со слотом в самом диалоге, и в этом слоте отрабатывай дальше что нужно. В Qt принято делать асинхронные интерфейсы на основе сигналов-слотов (если это возможно в данном конкретном случае). Что-то типа Код
Название: Re: Потоки Отправлено: bigory от Октябрь 23, 2010, 20:19 Слишком все сложно. Я не могу данные передать в Label
Код: #include "dialog.h" Название: Re: Потоки Отправлено: Alex Custov от Ноябрь 06, 2010, 18:53 Слишком все сложно. Я не могу данные передать в Label ... В этом коде какая-то каша, изучай Qt. Ты дважды вызываешь ui->setupUi(this); - зачем? У тебя локалый event loop - зачем? strIP=""; - делфизм, или билдеризм, уж не знаю. strIP=="" - аналогично. |