Проблема с правильным завершением дополнительного потока |
Здравствуйте, гость ( Вход | Регистрация )
Проблема с правильным завершением дополнительного потока |
AD |
12.9.2008, 10:06
Сообщение
#1
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Я не понимаю, почему у меня нет корректного завершения потока. Заходит в поток только при первом вызове, а соответственно рисует график только при первом выборе параметров, далее необходимо закрывать это диалоговое окошко и открывать снова- что крайне неудобно. Просьба, пожалуйста, поясните, в чем ошибки?
Ниже приведен код: thread
Заранее благодарен за помощь! |
|
|
ЙаМайскЫйПчОЛ |
12.9.2008, 10:24
Сообщение
#2
|
Участник Группа: Участник Сообщений: 154 Регистрация: 10.7.2008 Из: СПб Пользователь №: 232 Спасибо сказали: 7 раз(а) Репутация: 5 |
Удалено
Сообщение отредактировал ЙаМайскЫйПчОЛ - 12.9.2008, 11:05 |
|
|
Tonal |
12.9.2008, 10:32
Сообщение
#3
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Всё правильно - так и должно быть (в смысле выполнятся 1 раз).
В коде нужно if заменить на while, stopped с bool на QWaitCondition и добавить ещё QWaitCondition для убиения или лучше на QThreadPool или QtConcurrent::run переделать - тогда и стопать не надо и специально завершать. П.С. Ты уверен, что тут нужен отдельный поток? П.П.С. Убей дубль сообщения, чтобы не смущать народ. Сообщение отредактировал Tonal - 12.9.2008, 10:34 |
|
|
AD |
12.9.2008, 10:51
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Цитата(Tonal) Всё правильно - так и должно быть (в смысле выполнятся 1 раз). В коде нужно if заменить на while, stopped с bool на QWaitCondition и добавить ещё QWaitCondition для убиения или лучше на QThreadPool или QtConcurrent::run переделать - тогда и стопать не надо и специально завершать. П.С. Ты уверен, что тут нужен отдельный поток? П.П.С. Убей дубль сообщения, чтобы не смущать народ. С РАДОСТЬЮ УБИЛ БЫ, но у меня нет таких прав, а там уже тоже понаписали, блин! Был бы рад, если бы Вы набросок сделали, так не очень понятно. Можно с помощью QThreadPool набросок? P.S. Юра, ты убил? Спасибо! Стоп: в Qt 4.3.2 нет ни QThreadPool, ни QtConcurrent!!! Возможно я опять криво выразился, но мне необходимо, чтобы run запускался каждый раз, после нажатия кнопочки ОК! Чтобы поняли, о чем я, смотрите тему трепа "Результаты проекта", последние 2 рисунка. Сообщение отредактировал AD - 12.9.2008, 11:05 |
|
|
Tonal |
12.9.2008, 11:29
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Переходи на 4.4?
А набросок примерно такой:
Ну и в конце приложения нужно w_terminated.wakeAll() сделать. Только смысла в этом всём нет, т.к. у тебя получается, что главный поток просто замерзает и ждёт окончания рабочего. Чтобы не замерзал, нужно fillCurve разбить ровно на 2 половины: 1 - начать пересчёт, 2 - проверить не посчиталось ли (tryLockForRead), и если посчиталось - обновится. Ну и данные и потока и главного окна должны быть разные в этом случае. Сообщение отредактировал Tonal - 12.9.2008, 11:29 |
|
|
AD |
12.9.2008, 11:40
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Переходи на 4.4? За набросок спасибо, буду разбираться. Перейти на Qt 4.4 не могу. Коммерческая версия с интеграцией в Visual Studio 2005! Цитата Ну и в конце приложения нужно w_terminated.wakeAll() сделать. Только смысла в этом всём нет, т.к. у тебя получается, что главный поток просто замерзает и ждёт окончания рабочего. Чтобы не замерзал, нужно fillCurve разбить ровно на 2 половины: 1 - начать пересчёт, 2 - проверить не посчиталось ли (tryLockForRead), и если посчиталось - обновится. Ну и данные и потока и главного окна должны быть разные в этом случае. НЕ, не хочу, чтобы все застывало. В итоге я сделать хочу именно так, чтобы он заполнял по-частям. Но а пока сделать версию, чтобы это заполнение целиком происходило в доп. потоке! То, что работает быстрее, уже проверил! Т.е. приведенный кусок использовать без всяких вэйт кондишен? Мьютекс я использовал уж так, для того, чтобы не забыть, что я планирую в итоге сделать! А щас, хочу, чтобы попросту, после того, как в потоке заполнилось все, оно сразу же отобразилось! Сообщение отредактировал AD - 12.9.2008, 11:31 |
|
|
Tonal |
12.9.2008, 12:03
Сообщение
#7
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Я же написал, что нужно изменить - fillCurve() разбить на 2:
Причём эту test4Update() дёргать или в идле, или по таймеру, пока не посчитается. Ну и данные curveMap сделать разные для основного потока и для рабочего. Иначе всё равно придётся ждать окончания генерации. Сообщение отредактировал Tonal - 12.9.2008, 12:03 |
|
|
AD |
12.9.2008, 12:20
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Ну и последний вопросик:
А набросок примерно такой:
Опечатка? Имелось в виду w_run.writeForLock()? У меня есть rw_run, который в классе объявлен, а w_run вообще локально. |
|
|
AD |
12.9.2008, 13:26
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Видимо, где-то напортачил, но вот где? Ломается с сообщением:
Цитата mutex must be unlocked in the same thread, that locked! Вот код: thread
Сообщение отредактировал AD - 12.9.2008, 13:27 |
|
|
trdm |
12.9.2008, 13:39
Сообщение
#10
|
Дмитрий Трошин Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: 6 |
|
|
|
Текстовая версия | Сейчас: 29.11.2024, 1:33 |