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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: потоки перемешались  (Прочитано 13173 раз)
shirushizo
Гость
« Ответ #15 : Сентябрь 07, 2011, 08:10 »

Если хочешь использовать QMutex, надо чтобы все экземпляры класса test обращались к одному и тому же экземпляру QMutex. Сделай его глобальным или статическим членом класса test.

Код:
class test: public QThread /*, ...*/
{
  /*...*/
  private static QMutex mutex1;
  /*...*/
}

int test::time_test_2(int time_okonch,QString file_name,FT_HANDLE ftHandle1,QString serial,int tes)
{
  /*...*/
  test::mutex1.lock();
  /*...*/
  test::mutex1.unlock();
  /*...*/
}
Записан
StatuS74
Гость
« Ответ #16 : Сентябрь 07, 2011, 08:15 »

а что мне это даст если они будут к одному обращаться ?
Записан
StatuS74
Гость
« Ответ #17 : Сентябрь 07, 2011, 08:18 »

вроде забулькало.. теперь не пому почему после того как тест 3 закончился. происходит
Код:
 t3 = test::time_test_2(time_okonch_,file_name_,ftHandle1_,serial_,t3);
                if (t3==true)
                 {
                    emit mysignal_win(serial_);
                   
                 }
и после  emit валится программа.  пробывал и просто меседж вместо него написать тоже валится..
Записан
shirushizo
Гость
« Ответ #18 : Сентябрь 07, 2011, 10:30 »

а что мне это даст если они будут к одному обращаться ?
Когда один из потоков вызывает lock(), он захватывает данные и другие потоки не могу к этим данным обратится и будут ждать, когда данные освободятся. А если мьютексы будут разные, то каждый поток залочит свой экземпляр мьютекса и доступ к данным останется.

вроде забулькало.. теперь не пому почему после того как тест 3 закончился. происходит
...
и после  emit валится программа.  пробывал и просто меседж вместо него написать тоже валится..
Постом ниже было вроде так =)
Код:
int t3=0;
/*...*/
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_);
}
/*...*/
Падает при или после emit? Может объект-приемник инвалидный?

По сути: если с мьютексами заработало, то где-то между lock() и unlock() у тебя используются общие данные, это может быть: глобальные переменные или статические члены.
Записан
StatuS74
Гость
« Ответ #19 : Сентябрь 07, 2011, 10:42 »

падает на emit. щас разбираюсь.
Записан
StatuS74
Гость
« Ответ #20 : Сентябрь 07, 2011, 10:53 »

пробую и просто
 QMessageBox::warning(0,"ГОТОВО",
                              "Тестирование завершено для датчика с серийным номером  "
                                                                 +serial,
                                                                  QMessageBox::Ok,QMessageBox::Ok);

всеравно падает.. что то я даже не знаю на что подумать...
Записан
shirushizo
Гость
« Ответ #21 : Сентябрь 07, 2011, 10:58 »

Вызов QMessageBox возможен только в GUI-потоке, в других потоках вызвать не получится.

если без emit просто qDebug()<<"complete"; вызвать тоже падает?
Записан
StatuS74
Гость
« Ответ #22 : Сентябрь 07, 2011, 11:13 »

нет не падает. так сигнла тоже не катит Непонимающий а как тогда мне вывести сообщение ?
Записан
StatuS74
Гость
« Ответ #23 : Сентябрь 07, 2011, 13:25 »

эх... так и не нашол ответа как вывисти сообщение из потока =(
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


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

так и не нашол ответа как вывисти сообщение из потока
Для себя - qDebug и смотреть в консоли. Для пользователя - можно испускать сигнал с текстом сообщения-параметром, в гуёвом потке ловить слотом и показывать сообщение.
Записан
StatuS74
Гость
« Ответ #25 : Сентябрь 07, 2011, 13:44 »

а как в гуевый поток отправить сигнал ? дебагом я ловлю. у меня проект встал на месте что бы отображать пользователю.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


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

а как в гуевый поток отправить сигнал?
Как и любой другой - emit'ом.
Принимающий объект должен быть создан в гуёвом потоке. Тип коннекта не Qt::DirectConnection.
Записан
StatuS74
Гость
« Ответ #27 : Сентябрь 07, 2011, 14:17 »

ну все сообщение выводится тока номер серийника ни тот который должен. а последний..
Записан
StatuS74
Гость
« Ответ #28 : Сентябрь 07, 2011, 15:18 »

все равно на 3 тесте берет параметры последнего теста
Записан
shirushizo
Гость
« Ответ #29 : Сентябрь 07, 2011, 16:19 »

i
Код:
nt 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;
      }

mutex1.lock(); и mutex1.unlock(); где-то изменяется глобальная переменная или статический элемент, отсюда и неправильные данные для теста и серийный номер. Методом исключения - в ReadWrite(serial,nms,file_name,ftHandle1);
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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