Название: Усыпить главный поток, не блокируя его. Отправлено: myr от Апрель 28, 2010, 16:11 Здраствуйте, помогите, пож-та.
Есть приложение. Из главного окна запускаються 2 потока. Первый работает с БД. Второй ,в это время , отрисовывает progressbar на главном окне. Во время выполнения цикла никакие события не приходят. Почему? Спасибо Что можно использовать вместо sleep()?. Код: bool read{ // вызываеться из главного потока Код: void frmMain::customEvent( QCustomEvent *pe ) Код: class TThreadProgress:public QThread{ Название: Re: Усыпить главный поток, не блокируя его. Отправлено: sne от Апрель 28, 2010, 16:51 qApp->processEvents() вставить в цикл.
Название: Re: Усыпить главный поток, не блокируя его. Отправлено: Пантер от Апрель 28, 2010, 16:52 myr, пользуйся тегом code для оформления сообщений.
Название: Re: Усыпить главный поток, не блокируя его. Отправлено: myr от Апрель 28, 2010, 18:55 qApp->processEvents() вставить в цикл. Есть ужеНазвание: Re: Усыпить главный поток, не блокируя его. Отправлено: BRE от Апрель 28, 2010, 19:29 Из главного окна запускаються 2 потока. Для чего запускать новый поток и останавливать главный? Почему не нагрузить в это время его?Первый работает с БД. Второй ,в это время , отрисовывает progressbar на главном окне. Запусти один поток для работы с БД, а в главном потоке показывай progress. Название: Re: Усыпить главный поток, не блокируя его. Отправлено: Igors от Апрель 28, 2010, 19:36 Сюжет: не надо никого усыплять, просто запускаете нитку и она читает БД. Она же обновляет индикатор (можно через тот же postEvent), совершенно незачем делать еще 1 нитку для индикатора. Примерно так (псевдокод)
Код Еще лучше сделать progressbar членом TThreadBD и создавать/удалять его в конструкторе/деструкторе TThreadBD Название: Re: Усыпить главный поток, не блокируя его. Отправлено: myr от Апрель 29, 2010, 08:24 Спасибо. Уберу второй поток. Это я перемудрила.
Название: Re: Усыпить главный поток, не блокируя его. Отправлено: myr от Апрель 29, 2010, 10:27 И все таки. Пока работает главный поток, второй блокируеться. Как Усыпить главную нитку, чтобы выполнилась вторая.
Из второй нити обновлять прогресс - не подходит. Код: bool frmMain::readFromBD( QSqlQuery qry, QString str ) Код: void TThreadBD::run() Название: Re: Усыпить главный поток, не блокируя его. Отправлено: BRE от Апрель 29, 2010, 10:32 И все таки. Пока работает главный поток, второй блокируеться. Как Усыпить главную нитку, чтобы выполнилась вторая. Не может он блокироваться, если ты сама его не заблокируешь.Какой версией Qt ты пользуешься? Название: Re: Усыпить главный поток, не блокируя его. Отправлено: myr от Апрель 29, 2010, 10:47 QT 3.3
Нужно запустить нитку, которая работает с БД . И пока идет обработка выводить прогресс бар. Название: Re: Усыпить главный поток, не блокируя его. Отправлено: BRE от Апрель 29, 2010, 11:02 Не нужно здесь processEvents вызывать.
Код: void TThreadBD::run() Тестовый поток отработает очень быстро, результат ты скорее всего не увидишь. Увеличь задержку: sleep( 1 ); Название: Re: Усыпить главный поток, не блокируя его. Отправлено: Igors от Апрель 29, 2010, 12:17 Из второй нити обновлять прогресс - не подходит. Подходит если делать через сигнал (а можно и через postEvent)Код
Название: Re: Усыпить главный поток, не блокируя его. Отправлено: myr от Апрель 29, 2010, 13:29 Ура. Все заработало.
Спасибо. |