Russian Qt Forum

Qt => Model-View (MV) => Тема начата: blood_shadow от Апрель 24, 2011, 04:17



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


Название: Re: Завершить слот
Отправлено: Fat-Zer от Апрель 24, 2011, 04:30
1. завести какой-нибудь флаг, который проверять во время выполнения продолжительной операции (ведь там же какой-то цикл)
2. не очень понятно... можно кусок кода.


Название: Re: Завершить слот
Отправлено: blood_shadow от Апрель 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 сек если что то выйти нельзя..


Название: Re: Завершить слот
Отправлено: Fat-Zer от Апрель 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;
 }
}
 
ещё можно причесать всё это...


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

З.Ы. как-то тема никак не относится к model-view


Название: Re: Завершить слот
Отправлено: blood_shadow от Апрель 24, 2011, 17:50
З.Ы. как-то тема никак не относится к model-view
да вы правы, только сегодня увидел, в 4 часа утра вообще бошка помутнела  :)


Название: Re: Завершить слот
Отправлено: blood_shadow от Апрель 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
и вот оно... походу без терминейта не обойтись или код переписать асинхронно...