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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Потоки  (Прочитано 10753 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Сентябрь 04, 2015, 12:47 »

Есть простейшая программа обработки портов

Код
C++ (Qt)
Thread::Thread(QObject * parent): QThread(parent)
{
}
 
Thread::~Thread()
{
qDebug()<<__FUNCTIOIN__;
}
 
void Thread::run()
{
   while(1)
   {
       msleep(3);
       handlePress();        
   }
}
 
void Thread::handlePress()
{
 
// опрос портов
}
 
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);    
 
   counter = 0;
   thread = NULL;
 
   if(initNumberLineGPIO() && initDirectionLineGPIO())
   {
       thread = new Thread();
       thread->start();
   }
}
 
MainWindow::~MainWindow()
{
   delete ui;
 
   if(thread != NULL){
     thread->quit();
     thread->wait();
     delete thread;
  }
}
 

Но выдается ошибка
Код:
 QThread: Destroyed while thread is still running

хотя в деструктор Thread заходит, но сам процесс не убивается
не могу понять почему???
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Сентябрь 04, 2015, 12:56 »

Потому, что quit завершает цикл обработки событий потока, а вы его даже не запускаете.
Добавляйте свой флажок завершения бесконечного цикла в run.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Сентябрь 04, 2015, 13:17 »

Ожидал такого ответа.
Ну если правильно понял Вас )

делаю так
Код
C++ (Qt)
 
Thread::Thread(QObject * parent): QThread(parent)
{
 flag = true;
}
 
void Thread::run()
{
   while(flag)
   {
       msleep(3);
       handlePress();        
   }
}
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);    
 
   counter = 0;
   thread = NULL;
 
   if(initNumberLineGPIO() && initDirectionLineGPIO())
   {
       thread = new Thread();
       thread->start();
   }
}
 
MainWindow::~MainWindow()
{
   delete ui;
 
   if(thread != NULL){
     flag = false;
     thread->quit();
     thread->wait();
     delete thread;
  }
}
 

но выдается все таже ошибка
Код:
QThread: Destroyed while thread is still running
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Сентябрь 04, 2015, 13:19 »

Лучше flag сделать членом Thread и quit можно не вызывать.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #4 : Сентябрь 04, 2015, 13:28 »

))
И так делал как Вы сказали
Вот код
Код
C++ (Qt)
class Thread: public QThread{
 
public:
bool flag;
}
 
Thread::Thread(QObject * parent): QThread(parent)
{
 flag = true;
}
 
void Thread::run()
{
   while(flag)
   {
       msleep(3);
       handlePress();        
   }
}
 
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);    
 
   counter = 0;
   thread = NULL;
 
   if(initNumberLineGPIO() && initDirectionLineGPIO())
   {
       thread = new Thread();
       thread->start();
   }
}
 
MainWindow::~MainWindow()
{
   delete ui;
 
   if(thread != NULL){
     thread->flag = false;
     delete thread;
  }
}
 

Но не помогает ((
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Сентябрь 04, 2015, 13:33 »

Код
C++ (Qt)
MainWindow::~MainWindow()
{
   delete ui;
 
   if(thread != NULL){
     thread->flag = false;
     thread->wait();                        // !!! wait нужен
     delete thread;
  }
}
 

И что находится в handlePress?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #6 : Сентябрь 04, 2015, 13:39 »

Да конечно Вы правы!
Не убрал))
wait()
Код
C++ (Qt)
#define CNT_SAMPLE_MAX 4
#define CNT_SAMPLE_MIN 0
#define MAX_LINE_EVENT 10
 
typedef struct{
   int cnt_sample;//schetchik viborki
   int cnt_event_up; //schetchik sobitii
   int cnt_event_down;
   bool flag;
}gpio_line;
 
Код
C++ (Qt)
int number_gpio_line[amount_line] = {416,417,418,419,
                                    420,421,422,423,
                                    424,425,426,427,
                                    428,429,430,431,
                                    433,
                                    435,
                                    436
                                   };
 
 
gpio_line array_gpio_line[amount_line] = {{0,0,0,false},{0,0,0,false},{0,0,0,false},{0,0,0,false},
                                         {0,0,0,false},{0,0,0,false},{0,0,0,false},{0,0,0,false},
                                         {0,0,0,false},{0,0,0,false},{0,0,0,false},{0,0,0,false},
                                         {0,0,0,false},{0,0,0,false},{0,0,0,false},{0,0,0,false},
                                         {0,0,0,false},
                                         {0,0,0,false},
                                         {0,0,0,false}
                                        };
 
 
Код
C++ (Qt)
void Thread::handlePress()
{    
   for(int i = 0; i < amount_line; i++){
       QFile file;
       QDir::setCurrent("/sys/class/gpio/gpio" + QVariant(number_gpio_line[i]).toString());
       file.setFileName("value");
 
       if(file.open(QIODevice::ReadOnly)){
           QByteArray ba;
           ba = file.readAll();
           if(ba.at(0) == '1'){
               if(array_gpio_line[i].cnt_sample < CNT_SAMPLE_MAX){
                   array_gpio_line[i].cnt_sample++;
               }
               else if(!array_gpio_line[i].flag){
                   array_gpio_line[i].flag = true;
                   if( array_gpio_line[i].cnt_event_up < MAX_LINE_EVENT){//security counter
                       array_gpio_line[i].cnt_event_up++;
                   }
               }
           }
           else{
               if(array_gpio_line[i].cnt_sample > CNT_SAMPLE_MIN){
                   array_gpio_line[i].cnt_sample--;
               }
               else if(array_gpio_line[i].flag){
                   array_gpio_line[i].flag = false;
                   if( array_gpio_line[i].cnt_event_down < MAX_LINE_EVENT){//security counter
                       array_gpio_line[i].cnt_event_down++;
                   }
               }
           }
           file.close();
       }
       else{
           qDebug("file is not open");
       }
   }
}
 

Но к сожалению  в консоль выводится что программа завершилась
это уже лучше)))

но КРАХОМ ((
 

« Последнее редактирование: Сентябрь 04, 2015, 13:43 от demaker » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Сентябрь 04, 2015, 13:42 »

И еще вопрос. Вы уверены, что это сообщение выдается при разрушении именно этой нитки? Может есть другие?
Попробуйте за комментировать создание этой нитки - останется сообщение или нет?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #8 : Сентябрь 04, 2015, 13:54 »

Ну я только создаю только одну нитку - Thread. Конечно есть main ))

Давайте я скину проект)
Так будет проще

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Сентябрь 04, 2015, 13:57 »

ok
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #10 : Сентябрь 04, 2015, 13:57 »

Цитировать
while(flag)
    {
        msleep(3);
        handlePress();        
    }

это так и задумано, чтобы handlePress() выполнялся бесконечно?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #11 : Сентябрь 04, 2015, 14:03 »

 Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Сентябрь 04, 2015, 14:14 »

Добавьте в конструкторе MainWindow инициализацию thread:
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
ui(new Ui::MainWindow),
thread( 0 )
{
...
}
 

А в деструктор код завершения нитки.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #13 : Сентябрь 04, 2015, 14:39 »

А что
такая запись не катит
Код
C++ (Qt)
thread = new Thread();
 

 Непонимающий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Сентябрь 04, 2015, 14:40 »

А что
такая запись не катит
Код
C++ (Qt)
thread = new Thread();
 

 Непонимающий
А если
if(initNumberLineGPIO() && initDirectionLineGPIO())
вернет false? Улыбающийся
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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