многопоточность QThread |
Здравствуйте, гость ( Вход | Регистрация )
многопоточность QThread |
eldar85 |
21.6.2010, 14:25
Сообщение
#31
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
если не сделать
то поток просто убивается не доработав до конца, а тут запускается ожидание пока поток не будет закончен, в принципе работает нормально в таком плане... я не говорил что мне нужно закрыть окно, я имел вввиду что оно виснет пока потоки не выполнят все действия до конца. я даже не могу перетащить окно, оно висит пока не будет все выполнено. а Sleep(10); это просто чтобы между потоками какой то маленький промежуток был, хотя это не обязательно. |
|
|
BRE |
21.6.2010, 14:28
Сообщение
#32
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
если не сделать
то поток просто убивается не доработав до конца, а тут запускается ожидание пока поток не будет закончен, в принципе работает нормально в таком плане... я не говорил что мне нужно закрыть окно, я имел вввиду что оно виснет пока потоки не выполнят все действия до конца. я даже не могу перетащить окно, оно висит пока не будет все выполнено. Этот код, как раз и блокирует главный (GUI) поток, до тех пор, пока не отработают все запущенные потоки. Определись/разберись, что тебе нужно, и либо убери этот цикл (потоки будут работать!) или терпи блокирование GUI. |
|
|
eldar85 |
21.6.2010, 14:37
Сообщение
#33
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
убрав второй цикл все потоки тут же убиваются после того как закончиться первый цикл и все, получается просто ничего не работает. если убрать из ран() ожидание в 10 сек, то конечно все почти нормально, и то в консоли пишет что потоки убиты до того как они были закончены.
а если у меня в ран будет что то очень долго выполняться то поток просто будет убит ничего не сделав... |
|
|
BRE |
21.6.2010, 14:39
Сообщение
#34
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
убрав второй цикл все потоки тут же убиваются после того как закончиться первый цикл и все, получается просто ничего не работает. если убрать из ран() ожидание в 10 сек, то конечно все почти нормально, и то в консоли пишет что потоки убиты до того как они были закончены. а если у меня в ран будет что то очень долго выполняться то поток просто будет убит ничего не сделав... Потому что объекты Thread нужно создавать в куче (используя new), а не на стеке! |
|
|
eldar85 |
21.6.2010, 19:40
Сообщение
#35
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
большое вам спасибо, наконец то получилось)))
вот код
и главное окно не виснет, полностью активно пока выполняется процесс)))) еще раз спасибо) |
|
|
eldar85 |
25.6.2010, 10:26
Сообщение
#36
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
все же сложность одна осталась с многопоточностью, я никак не пойму как можно сделать так чтобы метод ран использовал главное окно для вывода на него информации:
сделал функцию для вывода на экран vivod(), в функции knopka() по нажатию кнопки запускается процесс, получается метод run() это другой класс Thread, а остальные все объекты относятся к классу mainWidow, возможно очень глупый вопрос, согласен, но я уже перерыл много инфы и что только не попробывал и никак не дойдет как же сделать из метода run() запуск функции vivod(). и пробывал vivod() сделать функцией другом в классе Thread friend void mainWindow::vivod(); но реакции ноль... помогите разобраться, ну никак не разберусь...
вот в документации приводится пример
получается тут в каждом потоке объявляется новый объект QTcpSocket socket; я так же делал со своим объектом и в консоли вывод что один и тот же объект уже был создан в другом потоке вот так попробывал
в итоге консоль выдала: QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread gggg QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread gggg QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread QObject::setParent: Cannot set parent, new parent is in a different thread gggg ............................................. Сообщение отредактировал eldar85 - 25.6.2010, 10:15 |
|
|
Алексей1153 |
25.6.2010, 10:34
Сообщение
#37
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Цитата чтобы метод ран использовал главное окно для вывода на него информации [offtop] довольно кровавый метод... (Хотя, мы тут в обливионе и не такое творим...) [/offtop] Ну а если серьёзно, то что мешает сделать в главном окне слот, а в потоке кидать сигналы ? И при чём тут создание объекта главного окна в каждом потоке - зачем ? Сообщение отредактировал Алексей1153 - 25.6.2010, 10:56 |
|
|
eldar85 |
25.6.2010, 10:38
Сообщение
#38
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
да я тоже думал об этом, только не совсем разберусь как это сделать...
получается в главном окне слот нужно сделать pablic slots??? и еще впрос, какой сигнал кидать в потоке??? я сильно путаюсь еще в сигналах... |
|
|
Алексей1153 |
25.6.2010, 10:42
Сообщение
#39
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
eldar85, там вроде пофиг, приватный он или открытый, точно не помню.
А путаешься в них зря - типы функций сигнала и слота должны быть одинаковые, вот и всё Перед запуском потока нужно connect его сигнал со слотом главного окна (С сигналами тут вообще многое упрощается В студии приходится передавать в поток указатель на внешний объект) Сообщение отредактировал Алексей1153 - 25.6.2010, 10:43 |
|
|
eldar85 |
25.6.2010, 10:50
Сообщение
#40
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
вот создал я паблик слот в главном окне
затем в срр его описал
и теперь метод run()
можете объяснить??? или мне коннект делать в цикле с запуском потоков?? |
|
|
Текстовая версия | Сейчас: 15.1.2025, 15:36 |