Russian Qt Forum
Ноябрь 23, 2024, 03:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Очередь событий потока  (Прочитано 11385 раз)
andrew.k
Гость
« : Июль 06, 2012, 14:10 »

Есть слот, который отрабатывает в отдельном потоке.
В определенный момент из основного потока в этот посылается сигнал.
Он не обрабатываетя, пока не завершится этот слот.
Как "протолкнуть" этот сигнал? что-то вроде processEvents() только для потока
Записан
OKTA
Гость
« Ответ #1 : Июль 06, 2012, 14:16 »

Qt::DirectCOnnect не канает разве?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Июль 06, 2012, 14:37 »

Как "протолкнуть" этот сигнал? что-то вроде processEvents() только для потока
processEvents() и работает применительно к тому потоку, в котором вызывается. Используйте его.
Записан
mutineer
Гость
« Ответ #3 : Июль 06, 2012, 14:45 »

Как "протолкнуть" этот сигнал? что-то вроде processEvents() только для потока

"Протолкунуть" - это прервать текущий слот и отреагировать на сигнал?
Записан
andrew.k
Гость
« Ответ #4 : Июль 06, 2012, 15:44 »

Qt::DirectCOnnect не канает разве?
Ну вообще канает конечно, но это не совсем то.
У QEventLoop есть метод processEvents. Но так как я не наследовался от QThread, то у меня нет доступа к его экземпляру. Поэтому никак не вызвать.
Записан
andrew.k
Гость
« Ответ #5 : Июль 06, 2012, 15:45 »

Как "протолкнуть" этот сигнал? что-то вроде processEvents() только для потока
processEvents() и работает применительно к тому потоку, в котором вызывается. Используйте его.
Т.е. если я вызову внутри слота работающего в неосновном потоке qApp->processEvents(), будут обработаны события текущего потока, а события основного потока будут не тронуты?
Записан
andrew.k
Гость
« Ответ #6 : Июль 06, 2012, 15:46 »

Как "протолкнуть" этот сигнал? что-то вроде processEvents() только для потока

"Протолкунуть" - это прервать текущий слот и отреагировать на сигнал?
Ну не совсем прервать, просто чтобы связанный с сигналом слот отработал.
И выполнение слота продолжилось (обычная логика processEvents)
Записан
mutineer
Гость
« Ответ #7 : Июль 06, 2012, 15:50 »

Как "протолкнуть" этот сигнал? что-то вроде processEvents() только для потока
processEvents() и работает применительно к тому потоку, в котором вызывается. Используйте его.
Т.е. если я вызову внутри слота работающего в неосновном потоке qApp->processEvents(), будут обработаны события текущего потока, а события основного потока будут не тронуты?

Цитировать
Processes all pending events for the calling thread according to the specified flags until there are no more events to process.
Ну судя по доке обрабатываются сигналы вызывающего потока. К тому же этот метод статический
Записан
andrew.k
Гость
« Ответ #8 : Июль 06, 2012, 16:02 »

Как "протолкнуть" этот сигнал? что-то вроде processEvents() только для потока
processEvents() и работает применительно к тому потоку, в котором вызывается. Используйте его.
Т.е. если я вызову внутри слота работающего в неосновном потоке qApp->processEvents(), будут обработаны события текущего потока, а события основного потока будут не тронуты?

Цитировать
Processes all pending events for the calling thread according to the specified flags until there are no more events to process.
Ну судя по доке обрабатываются сигналы вызывающего потока. К тому же этот метод статический
Ты прав. Не замечал, что он статический)
Вроде работает. Видимо, это и есть то, что я искал.
Записан
inforse
Гость
« Ответ #9 : Октябрь 24, 2012, 09:04 »

Скажите пожалуйста. У меня идет конект к базе, я вызываю форму. С помощью ProcessEvent форма вырисовывается, но "замораживается" На действия пользователя окно не откликается. Подскажите можно ли как-то при выполнении процесса, форму разморозить? Процесс запускаю Qprocess->start.
Код:
    stat_bd ->setText("Соединение..");
    this->setWindowTitle(QObject::tr("Статистика использования БД"));
    this->show();
    qApp->processEvents(QEventLoop::AllEvents);

    if (!db.open()) {
Записан
Bepec
Гость
« Ответ #10 : Октябрь 24, 2012, 10:33 »

startDetached
Записан
inforse
Гость
« Ответ #11 : Октябрь 24, 2012, 11:20 »

Но startDetached вызывает всплывающие окна в системе.

Я не много не правильно сформулировал вопрос. Есть два момента.

В моем коде при установлении соединения с БД окно замораживается "db.open" можно как-то этого избежать? Вычитал что открытие соединения в потоке, не поможет, так как для него создается свое собственное соединение.

И другой момент, вот при выполнении последовательно запускающихся процессов, окно тоже замораживается. Причем если запускаешь один, все нормально, окно реагирует, аесли ставишь в очередь другой, то пока не выполнится его не отпускает. ProcessEvent вставлял не помогло(

Записан
Bepec
Гость
« Ответ #12 : Октябрь 24, 2012, 13:50 »

StartDetached запускает процесс отдельно от вашего приложения. Независимо.

И что за "всплывающие окна", я незнаю. И не видел их. И вообще не знаю что вы запускаете.

А соединение с базой вроде спокойно переносится в другой поток, но точно не ручаюсь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Октябрь 24, 2012, 14:59 »

И другой момент, вот при выполнении последовательно запускающихся процессов, окно тоже замораживается. Причем если запускаешь один, все нормально, окно реагирует, аесли ставишь в очередь другой, то пока не выполнится его не отпускает. ProcessEvent вставлял не помогло(
По-моему QProcess::start и QProcess::startDetached - здесь без разницы т.к. процессы запускаются асинхронно и управление возвращается вызывающему (даже если ОС еще занимается запуском). Показываем код - а то что-то мутно на словах выходит
Записан
andrew.k
Гость
« Ответ #14 : Октябрь 25, 2012, 18:11 »

И другой момент, вот при выполнении последовательно запускающихся процессов, окно тоже замораживается. Причем если запускаешь один, все нормально, окно реагирует, аесли ставишь в очередь другой, то пока не выполнится его не отпускает. ProcessEvent вставлял не помогло(
По-моему QProcess::start и QProcess::startDetached - здесь без разницы т.к. процессы запускаются асинхронно и управление возвращается вызывающему (даже если ОС еще занимается запуском). Показываем код - а то что-то мутно на словах выходит
подписываюсь под этими словами.
Но чувствую, что если мы увидим код, мурашки пойдут по коже)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 22.