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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Завершить слот  (Прочитано 3814 раз)
blood_shadow
Гость
« : Апрель 24, 2011, 04:17 »

Всем доброе утро,
Создаю отдельный поток в этом потоке объект someObject, к которому подключаю
слот someSlot(выполняет продолжительную операцию)
1. Вопрос как убить слот someSlot еще до его завершения? то есть при наступлению
какого-то события выйти с него сразу
2. и второй вопрос если слот someSlot выполняется и вызывается еще раз этот самый слот
(допустим по нажатию кнопки) то этот слот выполниться только после завершения первого?
Записан
Fat-Zer
Гость
« Ответ #1 : Апрель 24, 2011, 04:30 »

1. завести какой-нибудь флаг, который проверять во время выполнения продолжительной операции (ведь там же какой-то цикл)
2. не очень понятно... можно кусок кода.
Записан
blood_shadow
Гость
« Ответ #2 : Апрель 24, 2011, 04:46 »

1. завести какой-нибудь флаг, который проверять во время выполнения продолжительной операции (ведь там же какой-то цикл)
2. не очень понятно... можно кусок кода.
дело в том что там стоит что-то наподобии этого:
Код
C++ (Qt)
while (sslSocket.bytesAvailable() < (int)sizeof(quint16))
{
   if (!sslSocket.waitForReadyRead(TIMEOUT))
   {
         emit errorDuringConnection("Error!");
         return;
   }
}
 
где TIMEOUT - где-то 10 сек. меньше делать, с одной стороны не дает чувство, а
вдруг медленный интернет, но и со слота 10 сек если что то выйти нельзя..
Записан
Fat-Zer
Гость
« Ответ #3 : Апрель 24, 2011, 05:05 »

ещё можно попробовать убивать поток терминейтом, правда это может не сработать, да и опасно это... (по этому поводу тут тема уже была, пришли к выводу, что гарантированно и безопасно убить можно только процесс).
ещё можно что-то вроде этого соорудить:
Код
C++ (Qt)
while (sslSocket.bytesAvailable() < (int)sizeof(quint16))
{
 int i;
 for(i=0;i<10;i++)
 {
     if(exitFlag)
       return;
     if(sslSocket.waitForReadyRead(TIMEOUT/10))
       break;;
 }
 if(i==10)
 {
   emit errorDuringConnection("Error!");
   return;
 }
}
 
ещё можно причесать всё это...
« Последнее редактирование: Апрель 24, 2011, 05:08 от Fat-Zer » Записан
CL0NE
Гость
« Ответ #4 : Апрель 24, 2011, 17:34 »

1. Можно сделать это слотом для остановки, в котором установим флаг "остановиться". А в теле слота "работа" либо добавить свой event loop, либо processEvents приложения использовать, и проверять флаг "остановиться".
2. Да. Пока выполняется тело слота, цикл обработки событий в данном потоке приостанавливается. После выхода из слота в цикл поступит следующее событие и слот снова вызовется. (Стоит прочитать обе части http://habrahabr.ru/blogs/qt_software/115830/)

З.Ы. как-то тема никак не относится к model-view
« Последнее редактирование: Апрель 24, 2011, 17:35 от CL0NE » Записан
blood_shadow
Гость
« Ответ #5 : Апрель 24, 2011, 17:50 »

З.Ы. как-то тема никак не относится к model-view
да вы правы, только сегодня увидел, в 4 часа утра вообще бошка помутнела  Улыбающийся
Записан
blood_shadow
Гость
« Ответ #6 : Апрель 28, 2011, 15:52 »

сначала было все хорошо, вместо sslSocket.waitForReadyRead(10000) приделал конструкцию:
Код
C++ (Qt)
int j = 0;
while (j < 10)
{
   if (sslSocket.waitForReadyRead(1000))
       break;
   ++j;
 
   if (stopped)
       break;
}
 

потом я заметил что waitForReadyRead иногда выдает false даже если данные есть, и тогда
весь цикл выполняется, заглянул на баг трекер - http://bugreports.qt.nokia.com/browse/QTBUG-14975
и вот оно... походу без терминейта не обойтись или код переписать асинхронно...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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