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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: потоки перемешались  (Прочитано 13147 раз)
StatuS74
Гость
« : Сентябрь 05, 2011, 06:26 »

сделал программу по тестированию датчиков. и столкнулся с такой штукой что  вовремя тест на одном из этапов когда один поток закончил работу. а второй  потом(2 датчик) перешел к последнему тесту то данные теста он берет не  свои а того датчика который до него был и начинает тестирование (продолжает) предыдущего датчика. не могу понять почему...

 вот часть когда для 2-х датчиков
Код:
 {switch (chet_dat)
        {
       case 1:
           {
               QString file_name1 = "datchic1.txt";
               test * t = new test();
               t->full_test(file_name1,nms,ftHandle1,serial1_1,
                           tn1_1,tk1_1,Tyd1_1);
               t->start();

               break;
           }
       case 2:
           {
               QString file_name2 = "datchic2.txt";
               test * t2 = new test();
               t2->full_test(file_name2,nms,ftHandle1,serial2,
                           tn2,tk2,Tyd2);
               t2->start();
               break;

           }
........
Записан
shirushizo
Гость
« Ответ #1 : Сентябрь 05, 2011, 08:11 »

Что делает метод test::full_test() и какие у него параметры?
nms,ftHandle1 и там, и там должны быть одинаковыми?
код самого теста бы увидеть.
Записан
StatuS74
Гость
« Ответ #2 : Сентябрь 05, 2011, 08:36 »

Код:
void test::full_test( QString file_name,QString nms,FT_HANDLE ftHandle1,QString serial,double tna,double tk,int time_okonch )
{
       file_name_=file_name;
        nms_=nms;
        ftHandle1_=ftHandle1;
        serial_=serial;
        tna_=tna;
        tk_=tk;
        time_okonch_=time_okonch;
}


потом я запускаю run

Код:
 void test::run()
    {
          bool fl=false;
          connect(this, SIGNAL(signal_win(QString)),SLOT(mysignal_win(QString)));
          connect(this, SIGNAL(signal_fail1(QString)),SLOT(mysignal_fail1(QString)));
          connect(this, SIGNAL(signal_fail2(QString)),SLOT(mysignal_fail2(QString)));
           fl=test::tempiratura_datchika(tna_,file_name_,nms_,ftHandle1_,serial_);
           if (fl == true)
           { int grad =0;
              grad = test::Start_test(tk_,file_name_,nms_,ftHandle1_,serial_);
              if (grad>=tk_-0.5)
              {  bool  time_full = false;
                 time_full = test::time_test_2(time_okonch_,file_name_,ftHandle1_,serial_);
                          if (time_full == true)
                  {
                            emit signal_win(serial_);

                  }
                    else
                 {
                     emit signal_fail2(serial_);
                 }
              }
              else
              {
                  emit signal_fail1(serial_);


              }}
           else
           {
                emit signal_fail1(serial_);

           }

    }


Записан
StatuS74
Гость
« Ответ #3 : Сентябрь 05, 2011, 08:50 »

получается тут следующее начинается тест (тестирую на параллельно 2-х прибора). проходят тест 1,2. потом например 1 датчик быстрее прошел первые 2 теста проходит 3 тест заканчивает его. второй датчик тока подошел к 3 тесту и запускается тест с аргументами того датчика который прошел уже тест
Записан
StatuS74
Гость
« Ответ #4 : Сентябрь 05, 2011, 13:02 »

nms,ftHandle1 одинаковые. нмс это номер сообщения  которое отправляется в командой в прогроматор а фтхендел это грубо говоря айди контроллера в прогроматоре
Записан
StatuS74
Гость
« Ответ #5 : Сентябрь 06, 2011, 06:01 »

проблему так и не решил.. подскажите что может быть ?
Записан
shirushizo
Гость
« Ответ #6 : Сентябрь 06, 2011, 08:59 »

Методы test::tempiratura_datchika, test::Start_test,test::time_test_2 зачем сделаны статическими?
Записан
StatuS74
Гость
« Ответ #7 : Сентябрь 06, 2011, 13:04 »

ну я решил что так будет правильней.
Записан
shirushizo
Гость
« Ответ #8 : Сентябрь 06, 2011, 13:31 »

Члены класса, с которыми работают методы, случаем не статические?
Записан
StatuS74
Гость
« Ответ #9 : Сентябрь 06, 2011, 13:37 »

не не статические.
вот методы класса
Код:
   static int Start_test(double,QString,QString,FT_HANDLE,QString);
    static bool tempiratura_datchika (double,QString ,QString ,FT_HANDLE ,QString);
    static QString Serialnum (const QString &serial);
    static bool time_test_2(int,QString,FT_HANDLE,QString);
    static void full_test( QString,QString,FT_HANDLE,QString,double,double,int);
    static double preobrazovanie(QString);
    void run();

Записан
shirushizo
Гость
« Ответ #10 : Сентябрь 06, 2011, 13:54 »

Что-то я не въеду, где потоки могу к одной и той же информации обратится.
Попробуй переделать статические методы в обычные. Если не поможет смотри в каком месте и в какой момент данные меняются.
Записан
StatuS74
Гость
« Ответ #11 : Сентябрь 06, 2011, 13:56 »

они обращаются к одним и темже функциям в классе ран. собственно то что я в поток и запускаю.
Записан
StatuS74
Гость
« Ответ #12 : Сентябрь 06, 2011, 14:24 »

сделать обычный метод не статический не помогло...
Записан
shirushizo
Гость
« Ответ #13 : Сентябрь 06, 2011, 15:36 »

Я сдаюсь, ты победил... Улыбающийся

Ты уверен, что нет данных в которые может писать и первый поток и второй? В третьем тесте используются: time_okonch_,file_name_,ftHandle1_,serial_ - все они члена класса test, и если они не объявлены статическими, то из одного экземпляра в другой доступа не должно быть.

Объявление класса test и реализацию test::time_test_2 в студию.
Записан
StatuS74
Гость
« Ответ #14 : Сентябрь 07, 2011, 05:58 »

вчера переписал этот метод теперь он выглядит так

Код:
int test::time_test_2(int time_okonch,QString file_name,FT_HANDLE ftHandle1,QString serial,int tes)
    {
        mutex1.lock();
       QString nms = "0";
       QTime time_konca;
       int vremia_t=tes;
       time_okonch=(time_okonch)*1000;
       time_konca.start();
          nms= test::ReadWrite(serial,nms,file_name,ftHandle1);
           vremia_t=time_konca.elapsed();
           mutex1.unlock();
          return vremia_t/1000;
      }

метод run стал выглядить так

Код:
 bool fl=false;
          int grad =0;

          int t3=0;
          connect(this, SIGNAL(signal_win(QString)),SLOT(mysignal_win(QString)));
          connect(this, SIGNAL(signal_fail1(QString)),SLOT(mysignal_fail1(QString)));
          connect(this, SIGNAL(signal_fail2(QString)),SLOT(mysignal_fail2(QString)));
           fl=test::tempiratura_datchika(tna_,file_name_,nms_,ftHandle1_,serial_);
           if (fl == true)
           {  grad = test::Start_test(tk_,file_name_,nms_,ftHandle1_,serial_);
              if (grad>=tk_-0.5)
              {

                 t3 = test::time_test_2(time_okonch_,file_name_,ftHandle1_,serial_,t3);
                 while(t3<=time_okonch_)
                   {

                     t3 = test::time_test_2(time_okonch_,file_name_,ftHandle1_,serial_,t3);


                 }
                 if(t3>=time_okonch_)
                  {
                            emit signal_win(serial_);

                        }
                    else
                 {
                     emit signal_fail2(serial_);
                 }
                }

              else
              {
                  emit signal_fail1(serial_);

              }}
           else
           {
                emit signal_fail1(serial_);

           }

    }


запускаю поток вот так

Код:
 {switch (chet_dat)
        {
       case 1:
           {
               QString file_name1 = "datchic1.txt";
               test * t = new test();
               t->full_test(file_name1,nms,ftHandle1,serial1_1,
                           tn1_1,tk1_1,Tyd1_1);
               t->start();

               break;
           }
       case 2:
           {
               QString file_name2 = "datchic2.txt";
               test * t2 = new test();
               t2->full_test(file_name2,nms,ftHandle1,serial2,
                           tn2,tk2,Tyd2);
               t2->start();


               break;
и тд для 12 датчиков

           }
« Последнее редактирование: Сентябрь 07, 2011, 06:05 от StatuS74 » Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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