2016-12-13 1 views
-1

Итак, я знаю, что в Qt вы можете просто положить все, что захотите, после того, как сигнал появится в слот, но при редактировании кода позже; что может потребовать много реструктуризации и может усложнить ситуацию.Каков самый простой способ заставить вашу программу ждать сигнала в Qt?

Есть ли более простой способ держать вашу программу, пока сигнал не излучается в Qt, как, скажем, к примеру:

downloadImage(); 
Qt::waitForSignal(downloadImageFinished()); 
editImage(); 

Также; почему это не работает:

// bool isFinished(); 
downloadImage(); // When done, isFinished() returns true; 
while (!isFinished()) {} 
editImage(); 

? Благодарю.

+5

Вы задаете неправильный вопрос. Мир вокруг нас не прост и не эволюционирует линейно. Все происходит асинхронно. Вам нужно структурировать код, чтобы отразить это. Псевдосинхронный код, который вы представляете в вопросе, является неявным автоматом. Вы получите больше ясности и гибкости, сделав явное поведение с учетом состояния. * что может потребовать много реструктуризации и может усложнить ситуацию * Только если вы сделаете это неправильно. Измените свой вопрос, чтобы иметь более полный пример того, что вы пытаетесь сделать. Таким образом можно было бы решить ваши необоснованные презумпции сложности. –

+1

@KubaOber Иногда это нужно сделать - например, дождаться завершения всех действий и всех блокировок для разблокировки перед выключением программы. Я столкнулся с этим первым, когда пользователь нажал кнопку окна «X» во время тяжелой обработки видео, не останавливая его - многие потоки были подняты, и было выделено много ресурсов, что приводило к случайным сбоям и предупреждениям при выключении, когда мьютексы не были разблокированы должным образом. –

+3

Когда пользователь хочет закрыть окно, у вас есть полный контроль над закрытием этого окна и над тем, какую обратную связь будет предлагать ваш код пользователю. Леонтьев. У вас, похоже, очень конкретный вопрос. Вы можете опубликовать новый автономный вопрос, который создает некоторые потоки или что-то еще, приобретает блокировки и демонстрирует вашу проблему. Он будет соответствовать 200 линиям. Только тогда может быть представлено решение, которое обойдутся проблемами, которые вы ожидаете. В противном случае, это слишком абстрактно, чтобы говорить. –

ответ

3

В принципе, вы должны сделать это:

QEventLoop loop; 
    connect(this, &SomeObject::someSignal, &loop, &QEventLoop::quit); 
    // here you can send your own message to signal the start of wait, 
    // start a thread, for example. 
    loop.exec(); //exec will delay execution until the signal has arrived 

Подождите внутри цикла будет положить поток исполнения в обреченности спин-блокировки - это не должно произойти в любой программе. Избегайте затворников любой ценой - вы не хотите иметь дело с последствиями. Даже если все работает правильно, помните, что вы возьмете всего процессорного ядра только для себя, что значительно замедлит общую производительность ПК в этом состоянии.

+1

Кроме того, убедитесь, что сигнал не сигнализирован перед запуском QEventLoop :: exec(). В случае, когда асинхронная операция иногда (редко) заканчивается достаточно быстро, чтобы это произошло, она может создать некоторые черты ошибок, которые можно найти. –

Смежные вопросы