| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt4] Функция в отдельном потоке |
| Автор: Girin 20.3.2008, 11:09 |
| Как можно получить значение возвращаемой функцией запущенной в отдельном потоке (использую QThread) ? |
| Автор: SABROG 20.3.2008, 11:35 | ||||
Унаследуй QThread, переопредели функции, которые должны возвращаться значение. Пример из ассистанта:
Например так:
И проверять это значение, когда придет сигнал finished. Может быть можно и как-то эстетичнее, сейчас в голову ничего не приходит. |
| Автор: Lazin 20.3.2008, 11:43 | ||
| добавь к классу-потоку - переменную, в которую записывай результат работы... но прежде чем оттуда читать - жди пока поток отработает хотя мне такой дизайн не нравиться, я свои программы строю по другому))) Добавлено через 6 минут и 17 секунд
в коде использовал win32 api, так как не знаю, что там в Qt за синхронизация))) еще не написал конструктор, потому-что лень... Добавлено через 8 минут и 42 секунды дурость конечно смешивать winapi и Qt код)) |
| Автор: SABROG 20.3.2008, 11:54 |
| А какой смысл замораживать приложение в ожидании результирующего значения, зачем тогда поток нужен, если его цель сделать программу рабочей в момент долгих операций ? |
| Автор: SABROG 20.3.2008, 12:48 |
| Если есть условие, что что-то должно сделаться в зависимости от результата в потоке, то почему просто не заставить поток это сделать ? Например во всех моих программах, где я использовал чистый WinApi с потоками основная идея сводилась к тому, чтобы по результату потока поменять что-то в интерфейсе программы - переименовать кнопку, включи/отключить кнопки, вывести текст в edit и т.д. Все это я делал из потока, а не из главного цикла. Если поток должен вернуть массив данных, то почему просто не передать в него указатель на этот массив, он сам его заполнит. Если без результата из потока невозможно дальнейшее выполнение программы, то обычно создают модальное окно с каким-нибудь progressBarом и кнопкой Cancel. В этом случае само наличие потока нужно только для обеспечения комфортности пользователя, мало ли подумает программа зависла, а так видит окошко перерисовывается, кнопочку можно нажать в любой момент, тормозов как с processAllEvents нету. |
| Автор: Girin 20.3.2008, 14:29 | ||||
Сделал как вы посоветовали , а именно создал класс производный от QThread , переопределил его метод
Далее объявил одно из приватных полей основного класса как поле типа DllThread, и в конструкторе вызвал соостствующий connect. Но сигнал finished() почему то не генерируется и результата вычислений нет .. Плюс к этому пришлось перенести определение всех методов основного класса(виджет), которые нужно выполнить в отдельном потоке в класс, унаследованный от QThread. В итоге код стал малочитаемым и запутанным . Есть ли другой подход |
| Автор: SABROG 20.3.2008, 14:43 |
| Есть. Определения никуда не переносить, а прописать френда в класс основного окна. Или передать в конструктор тупо указатель, главное, чтобы окно не деструктнулось перед тем как поток завершится. Самому отправлять finished() не нужно. Оно приходит, когда поток завершается, само. |
| Автор: Girin 20.3.2008, 14:55 |
| Попробовал вариант с передачей указателя в конструктор, получилось как надо. SABROG, Lazin благодарю за помощь |
| Автор: SABROG 20.3.2008, 15:34 | ||
Кстати глянь еще QtConcurrent, там какая-то крутая технология распараллеливания потоков по ядрам процессора используется.
|
| Автор: Girin 22.3.2008, 01:59 |
| Да судя по описанию на офф сайте многообещающая технология , но как я понял только в бета разработке и включена в Qt , начиная с версии 4.4 |