Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: QTime'ы в двух QThread'ах.  (Прочитано 1185 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Белый пони

  • Автор темы
  • Любитель
  • *
  • Сообщений: 63
    • Просмотр профиля
QTime'ы в двух QThread'ах.
« : 13 Июля 2010, 10:25:07 »
Суть:
имеется два thread'а в одном данные считываются с внешнего устройства, при каждом считываении испускается сигнал. В другом thread'е при получении сигнала эти данные записываются в файл;

в каждом из thread'ов свой экземпляр QTime. Так вот интервалы измерянные этими QTime'ами не совпадают.  То есть если данные считываются раз в 100 мс (согласно таймеру в одном п-ссе), то в файл они записываются раз в примерно 120 мс (согласно таймеру в другом процессе).  (аналогично было, когда в считывающем процессе задержка выполнялась с помощью rdtsc() )

Как же так?

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: QTime'ы в двух QThread'ах.
« Ответ #1 : 13 Июля 2010, 11:54:45 »
Ну так ведь твоё приложение не одно в системе это раз, а сигнал между потоками передаётся через обмен событиями в двух event loop'ах. В потоке A был сгенерирован сигнал так как со слотом он соединён через QueuedConnection (это поведение функции QObject::connect() по умолчанию для сигналов и слотов в разных потоках), то вместо вызова слота напрямую, создаётся событие, в него складываются аргументы и оно thread-safe способом передаётся в event loop'ы потоков, в которых живут объекты слоты которых связанны с этим сигналом. А уж оттуда и происходит вызов слотов. Отсюда и набегает разница.

Оффлайн Белый пони

  • Автор темы
  • Любитель
  • *
  • Сообщений: 63
    • Просмотр профиля
Re: QTime'ы в двух QThread'ах.
« Ответ #2 : 13 Июля 2010, 14:18:34 »
Ну я понимаю, что между испусканием сигнала и выполнением слота проходит время.
Но ведь периоды считывания и обработки должны быть равны?  Иначе получается, что в одном thread'е счётчик QTime тикает быстрее чем в другом, разве это возможно?  Или я опять не так понял?


Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: QTime'ы в двух QThread'ах.
« Ответ #3 : 13 Июля 2010, 14:40:11 »
Если один из потоков движется со скростью v относительно другого, то происходит релятивистское замедление времени и
Цитировать
получается, что в одном thread'е счётчик QTime тикает быстрее чем в другом
:)

А количество считываний/записей совпадает или они куда-то теряются? Эта статистическая картина верна в 100% случаев или иногда интервал между записями оказывается существенно меньше чем между считываниями? Можешь привести пример кода демонстирирующий проблему?

Оффлайн Белый пони

  • Автор темы
  • Любитель
  • *
  • Сообщений: 63
    • Просмотр профиля
Re: QTime'ы в двух QThread'ах.
« Ответ #4 : 13 Июля 2010, 15:40:36 »
А количество считываний/записей совпадает или они куда-то теряются? Эта статистическая картина верна в 100% случаев или иногда интервал между записями оказывается существенно меньше чем между считываниями? Можешь привести пример кода демонстирирующий проблему?

Аааааа!!! Идиото! :o

Пока копипастил нашёл косяк.

void Read8Thread::run()
{
...
QTime myTimer;

...
cycleflag = 1;
while( cycleflag )
          {
          //ini = Ini = rdtsc();
          myTimer.start();
       
          ....
          for( j = 0; j < 8; j++)
                    {
                    ....   
                    emit got_new_I( buildI(IByte[1], IByte[0]), j);
                    ....
                   if( j == 7)
                        {
                        do {      // End = rdtsc();
                                     //loopTime = (End - Ini) / CPU_MHz;
                            }while( myTimer.elapsed() < 79 );   // раньше было loopTime <78930

                        cerr <<  myTimer.restart() << "  ";
                        //cerr << loopTime << "  ";
                        //Ini = End;
                        }
                    }
           }
}
( в коде остались следы использования rdtsc() )

Надо было кусок //ini = Ini = rdtsc();
          myTimer.start();
вынести за начало цикла. Я тупо "съедал" кусок периода, те самые 20 мс.

Погрешность всё равно осталась, но теперь она не нарастает, а колеблется в окрестности среднего +- 5-15 мс, примерно.

Размышляю тут о сущности времени, а сам так скосячил.

Извиняюсь, за ложную тревогу :)

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: QTime'ы в двух QThread'ах.
« Ответ #5 : 13 Июля 2010, 15:46:10 »
Ничего в жизни всякое бывает :)

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: QTime'ы в двух QThread'ах.
« Ответ #6 : 14 Июля 2010, 08:47:55 »
Если 2 поток очень длинный и при этом пропадают события от тиков первого, по кешируйте запросы (типа FIFO).
А в медленном потоке обрабатывайте все чохом.
Если все таки синхронизация важна, то важную часть надо делать коротенькой.
ЗЫ. Вообще-то смысл в таймере в длинном потоке вызывает лично у меня недоумение. Но это чисто, мсм.
« Последнее редактирование: 14 Июля 2010, 08:58:47 от alexander.pronin »

 

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