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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread, terminate (), finished ()  (Прочитано 7999 раз)
taifun
Гость
« : Май 07, 2010, 09:24 »

Здраствуйте, помогите разобраться. По нажатию кнопки мыши создаю дочерний поток, в котором обрабатываю данные, сделал так:
Код:
void clthreadzip::run()
{  
   .............
   while (intCount < 1000) {
      ................
   }
   // и тут мне надо отослать сигнал, что обработка данных окончена
   // и для этого я вызываю функцию terminate (), которая должна завершить поток и соответственно отсылать сигнал finished ()
   // но этого не происходит. Более того она по моему вообще зависает
   terminate ();
}

Вот точно я что-то не так понимаю, вот только что? Разъясните ситуацию.
« Последнее редактирование: Май 07, 2010, 09:43 от taifun » Записан
BRE
Гость
« Ответ #1 : Май 07, 2010, 09:27 »

А как "туда" может управление попасть, если у тебя цикл бесконечный.
Когда расчет окончен, нужно просто выйти из цикла и поток завершиться и сигнал отошлет.
Записан
taifun
Гость
« Ответ #2 : Май 07, 2010, 09:50 »

А как "туда" может управление попасть, если у тебя цикл бесконечный.
Когда расчет окончен, нужно просто выйти из цикла и поток завершиться и сигнал отошлет.


Извиняюсь, не коректно условие в while () написал (не то имел ввиду). Я так понимаю должен отослаться сигнал finished()? если да, то это не происходит, потому что (в главном потоке):

Код:
clthreadzip ZFileRead;
void MainWindow::init()
{
    QObject::connect(&ZFileRead, SIGNAL(finished()), this, SLOT(FinishThread()));
}
void MainWindow::FinishThread(){

    ui->pgBar->setValue(ui->pgBar->maximum());
    ui->statusBar->showMessage(trUtf8("Обработка данных завершена"));
    qDebug() << trUtf8("Thread Finished!");
}

а у меня получается, что когда поток отработал я не получаю не одного уведомления об этом, следуя из этого я могу сказать, что сигнал finished() не приходит.
Записан
AlekseyK
Гость
« Ответ #3 : Май 07, 2010, 10:34 »

terminate лучше не пользоваться, они и сами об этом пишут, сам только недавно сталкивался. Если надо поток остановить из вне - есть выход более простой, элегантный и красивый: добавляешь в свой clthreadzip слот, например, setTerminated() и переменную, например, isTerminated и по сигналу из вне меняешь её на true, а цикл твой можно переписать так:

Код
C++ (Qt)
void clthreadzip::run()
{  
  .............
  while (intCount < 1000 && !isTerminated ) {
     ................
  }
}

По окончании run finished() вызовется автоматом, а при использовании terminated() этого почему-то не происходит.
Записан
taifun
Гость
« Ответ #4 : Май 07, 2010, 11:47 »

ага, идея отличная - управление циклом (потоком) из вне (на данный момент из вне я управляю им как раз c помошью terminate() ), но проблема у меня пока в том что по оканчанию run() сигнал finished() не отсылается - вот в чем вопрос. Я, конечно же, и сам могу его отсылать? но по идеи он должен отсылаться автоматически  Непонимающий
Записан
AlekseyK
Гость
« Ответ #5 : Май 07, 2010, 12:20 »

ага, идея отличная - управление циклом (потоком) из вне (на данный момент из вне я управляю им как раз c помошью terminate() ), но проблема у меня пока в том что по оканчанию run() сигнал finished() не отсылается - вот в чем вопрос. Я, конечно же, и сам могу его отсылать? но по идеи он должен отсылаться автоматически  Непонимающий

Повторяю: он и отсылается автоматически по завершении run, но terminate использовать нельзя! Улыбающийся Иначе сигнал не отсылается.
Записан
taifun
Гость
« Ответ #6 : Май 07, 2010, 13:27 »

Повторяю: он и отсылается автоматически по завершении run, но terminate использовать нельзя! Улыбающийся Иначе сигнал не отсылается.

Я вас прекрасно понял, я имел ввиду, что terminate() убрал. но по оканчанию run() сигнал finished() не отсылается все равно.
Записан
AlekseyK
Гость
« Ответ #7 : Май 07, 2010, 14:14 »

Странно, но у меня waitForFinished() работает. Может явно сигнал отсылать emit finished()?
Записан
taifun
Гость
« Ответ #8 : Май 07, 2010, 14:44 »

Странно, но у меня waitForFinished() работает. Может явно сигнал отсылать emit finished()?

Можно, пока так и делаю  Улыбающийся просто хочется разобраться в чем дело  Непонимающий
Записан
AlekseyK
Гость
« Ответ #9 : Май 07, 2010, 15:03 »

Странно, но у меня waitForFinished() работает. Может явно сигнал отсылать emit finished()?

Можно, пока так и делаю  Улыбающийся просто хочется разобраться в чем дело  Непонимающий

Дело как всегда в том, что мы не читаем документацию: Подмигивающий

Цитировать
Each QThread can have its own event loop. You can start the event loop by calling exec(); you can stop it by calling exit() or quit(). Having an event loop in a thread makes it possible to connect signals from other threads to slots in this thread, using a mechanism called queued connections. It also makes it possible to use classes that require the event loop, such as QTimer and QTcpSocket, in the thread. Note, however, that it is not possible to use any widget classes in the thread.

int QThread::exec ()   [protected]
Enters the event loop and waits until exit() is called, returning the value that was passed to exit(). The value returned is 0 if exit() is called via quit().

It is necessary to call this function to start event handling.

See also quit() and exit().

Код
C++ (Qt)
class MyThread : public QThread
{
public:
    void run();
};
 
void MyThread::run()
{
    QTcpSocket socket;
    // connect QTcpSocket's signals somewhere meaningful
    ...
    socket.connectToHost(hostName, portNumber);
    exec();
}
« Последнее редактирование: Май 07, 2010, 15:05 от AlekseyK » Записан
taifun
Гость
« Ответ #10 : Май 07, 2010, 15:36 »

не то (в моем случаи не нужно постоянно "крутить" run(), while() отработал и все - дело сделано), да и не помогло - проверил.
Записан
AlekseyK
Гость
« Ответ #11 : Май 07, 2010, 16:04 »

Пиши в багзиллу Подмигивающий
Записан
taifun
Гость
« Ответ #12 : Май 12, 2010, 07:45 »

Вот, накидал простенький примерчик, если кому интересно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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