crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Помогите разобаться с потоками.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
franza Дата 10.1.2011, 19:24
  спасибо, вроде разобрался. напишу еще, если появятся вопросы.
Litkevich Yuriy Дата 10.1.2011, 19:13
 
Цитата(franza @ 10.1.2011, 18:47) *
я имею ввиду, что этот отдельный поток, где создаются виджеты и есть главный.
лучше главный поток и называть главным, чтобы никого столку не сбивать.
Цитата(franza @ 10.1.2011, 20:28) *
3 виджета (лсд, кнопка, и базовый, куда они помещаются) создаются в main.cpp. При этом они создаются в главном потоке или нет?
Да. Всё что не является наследником QThread и не использует moveToThread() находится в главном потоке.

Цитата(Litkevich Yuriy @ 10.1.2011, 20:45) *
Всё что не является наследником QThread
если быть более точным, то - сам наследник QThread создаётся в главном потоке, а затем вызывается его метод start(), который, в свою очередь, вызывает метод run(). Дак вот именно метод run() и выполняется в отдельном потоке, и как следствие, все объекты созданные в методе run() находятся в отдельном потоке.



Цитата(franza @ 10.1.2011, 20:28) *
Слоты, к которым происходит коннект вызываются в главном потоке или нет?
Слоты находятся в том потоке, в котором находится их объект. Если у тебя все виджеты в главном потоке, то и их слоты соответственно тоже в главном потоке, но это справедливо для соединений типа "авто" (по умолчанию) и "в очередь"(queued).



Цитата(ufna @ 10.1.2011, 4:15) *
А здесь я не уверен насчет сигналов до exec() в потоке.
Собственноручно посылать сигнал можно, а вот, например, сигнал от таймера (созданного здесь же) уже посылаться не будет, т.к. локальная очередь событий не запущена и в таймере не произойдёт события "таймаут"

Ну а вообще:
Цитата(ufna @ 10.1.2011, 1:59) *
... виджеты живут в основном потоке, но если они получают неприрывный поток сигналов, они это отрабатывают и не дают возможности сигналам и событиям перемещения прийти.
+100
franza Дата 10.1.2011, 18:28
  Litkevich Yuriy, понимаю. Можешь попробовать рассказать о моей ошибке не в одном предложении, а подробнее, так как видно, что я мало понимаю. Мне непонятно следующее: 3 виджета (лсд, кнопка, и базовый, куда они помещаются) создаются в main.cpp. При этом они создаются в главном потоке или нет? Если нет, то как создать их в главном потоке? Слоты, к которым происходит коннект вызываются в главном потоке или нет?
Litkevich Yuriy Дата 10.1.2011, 17:35
  franza, ту по-русски вообще понимаешь?
franza Дата 10.1.2011, 16:47
  ufna, можно поподробней?

Litkevich Yuriy, я имею ввиду, что этот отдельный поток, где создаются виджеты и есть главный.
ufna Дата 10.1.2011, 2:15
  Вообще по-хорошему не так делается :) Можно сделать класс "посылатель сигналов" и пихать его в поток, при этом не переопределяя поток, а делая moveToThread - это будет более правильно.

А здесь я не уверен насчет сигналов до exec() в потоке.
franza Дата 10.1.2011, 0:23
  ufna, то есть, в принципе, написано все правильно, только надо usleep(100500) написать?
ufna Дата 9.1.2011, 23:59
  Чет мне подсказывает, что закидывать в while() сообщениями без пауз - это не лучший метод :) виджеты живут в основном потоке, но если они получают неприрывный поток сигналов, они это отрабатывают и не дают возможности сигналам и событиям перемещения прийти.
Litkevich Yuriy Дата 9.1.2011, 23:41
 
Цитата(franza @ 10.1.2011, 0:41) *
о при выполнении родительский виджет повисает и не дает себя ни перетаскивать ни закрывать, хотя по идее находится в отдельном потоке.
Цитата(Litkevich Yuriy @ 10.1.2011, 0:02) *
виджеты могут находится только в главном потоке.
franza Дата 9.1.2011, 22:41
  виджеты создаются в главном потоке (по крайней мере в main.cpp), в run для каждого потока я написал только отправку сигналов, к которым в main.cpp коннектится соответствующий слот. здесь, думаю, я не ошибся. но при выполнении родительский виджет повисает и не дает себя ни перетаскивать ни закрывать, хотя по идее находится в отдельном потоке.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 17:44