![]() |
|
![]() ![]() ![]() |
|
Girin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Как можно получить значение возвращаемой функцией запущенной в отдельном потоке (использую QThread) ?
|
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Унаследуй QThread, переопредели функции, которые должны возвращаться значение. Пример из ассистанта:
Например так:
И проверять это значение, когда придет сигнал finished. Может быть можно и как-то эстетичнее, сейчас в голову ничего не приходит. Это сообщение отредактировал(а) SABROG - 20.3.2008, 11:46 |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
добавь к классу-потоку - переменную, в которую записывай результат работы...
но прежде чем оттуда читать - жди пока поток отработает хотя мне такой дизайн не нравиться, я свои программы строю по другому))) Добавлено через 6 минут и 17 секунд
в коде использовал win32 api, так как не знаю, что там в Qt за синхронизация))) еще не написал конструктор, потому-что лень... Добавлено через 8 минут и 42 секунды дурость конечно смешивать winapi и Qt код)) |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А какой смысл замораживать приложение в ожидании результирующего значения, зачем тогда поток нужен, если его цель сделать программу рабочей в момент долгих операций ?
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
ну я же написал что:
во вторых: если нужно прочитать и использовать результат, то нужно полюбому дождаться завершения потока... а в твоем коде можно использовать результат до того как он будет вычислен, результат же не обязательно должен использоваться в слоте получающем сигнал finished (ну и .... этот ваш Qt) |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Если есть условие, что что-то должно сделаться в зависимости от результата в потоке, то почему просто не заставить поток это сделать ? Например во всех моих программах, где я использовал чистый WinApi с потоками основная идея сводилась к тому, чтобы по результату потока поменять что-то в интерфейсе программы - переименовать кнопку, включи/отключить кнопки, вывести текст в edit и т.д. Все это я делал из потока, а не из главного цикла.
Если поток должен вернуть массив данных, то почему просто не передать в него указатель на этот массив, он сам его заполнит. Если без результата из потока невозможно дальнейшее выполнение программы, то обычно создают модальное окно с каким-нибудь progressBarом и кнопкой Cancel. В этом случае само наличие потока нужно только для обеспечения комфортности пользователя, мало ли подумает программа зависла, а так видит окошко перерисовывается, кнопочку можно нажать в любой момент, тормозов как с processAllEvents нету. Это сообщение отредактировал(а) SABROG - 20.3.2008, 12:53 |
|||
|
||||
Girin |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Сделал как вы посоветовали , а именно создал класс производный от QThread , переопределил его метод
Далее объявил одно из приватных полей основного класса как поле типа DllThread, и в конструкторе вызвал соостствующий connect. Но сигнал finished() почему то не генерируется и результата вычислений нет .. Плюс к этому пришлось перенести определение всех методов основного класса(виджет), которые нужно выполнить в отдельном потоке в класс, унаследованный от QThread. В итоге код стал малочитаемым и запутанным . Есть ли другой подход Это сообщение отредактировал(а) Girin - 20.3.2008, 14:29 |
||||
|
|||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Есть. Определения никуда не переносить, а прописать френда в класс основного окна. Или передать в конструктор тупо указатель, главное, чтобы окно не деструктнулось перед тем как поток завершится.
Самому отправлять finished() не нужно. Оно приходит, когда поток завершается, само. |
|||
|
||||
Girin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Попробовал вариант с передачей указателя в конструктор, получилось как надо. SABROG, Lazin благодарю за помощь
|
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Кстати глянь еще QtConcurrent, там какая-то крутая технология распараллеливания потоков по ядрам процессора используется.
![]()
Это сообщение отредактировал(а) SABROG - 20.3.2008, 15:40 |
|||
|
||||
Girin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 6.2.2008 Репутация: нет Всего: нет |
Да судя по описанию на офф сайте многообещающая технология , но как я понял только в бета разработке и включена в Qt , начиная с версии 4.4
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |