LINUX.ORG.RU

приоритеты потоков с использованием библиотеки Qt4.5


0

1

Здравствуйте! Прошу помочь разобраться в ситуации!!! Суть задачи такова. Есть два потока. Один каждый 15 мс в режиме реального времени считывает информацию с устройств. Второй поток каждую секунду рисует на экране в QTabWidget'е всякие графики и таблицы, используя информацию, из первого потока. Проблема: при переключении закладок QTabWidget'а или при вызове каждую секунду функции update (), на 200-300 мс прерывается первый поток (время прерывания увеличивается почти до полу-секунды, при более трудной графике), который по заданию не должен быть прерван ничем. Я поставил планировщик sched_rr и выдал приоритет потоку один (поток сборки - TimerThread) равный 99, а потоку 2 (MainWindowThread) приоритет 1, но он все равно каждую секунду пролезает и выполняет свою отрисовку, хотя должен выполнять ее только когда первый поток бездействует.

использую библиотеку Qt4.5

Ниже привожу листинг программы.

#include <QApplication>
#include <QTextCodec>
#include <QThread>

struct sched_param thread_sched_param;
pthread_mutex_t mtx;
uint8_t nMutex_Check;

class TimerThread : public QThread
{
  Q_OBJECT
  public:
    TimerThread ();
    void run ();
  protected:
    void timerEvent(QTimerEvent*);
};
extern TimerThread TThread;

class MainWindowThread : public QThread
{
  Q_OBJECT
  public:
    MainWindowThread ();
    MainWindow *Win; (здесь по сути создается QTabWiget с 10-12 закладками)
    void run ();
  protected:
    void timerEvent(QTimerEvent*);
};
extern MainWindowThread MWThread;

class GetDataThread : public QThread
{
  Q_OBJECT
  public:
    GetDataThread ();
    void run ();
}
GetDataThread GDThread;

class SendDataThread : public QThread
{
  Q_OBJECT
  public:
    SendDataThread ();
    void run ();
}
SendDataThread SDThread;



int main(int argc, char* argv[])
{
  thread_sched_param.sched_priority = sched_get_priority_max (SCHED_RR);
  sched_setscheduler (0, SCHED_RR, &thread_sched_param);

  QApplication app (argc, argv);

  TimerThread TThread;
  TThread.start (QThread::TimeCriticalPriority);

  MainWindowThread MWThread;
  MWThread.start (QThread::IdlePriority);

  return app.exec();
}
struct sched_param thread_sched_param;

GetDataThread GDThread;
SendDataThread SDThread;

TimerThread :: TimerThread ()
{
        pthread_setschedprio (pthread_self(), 99);
}

void TimerThread :: run ()
{
  startTimer(15);     // 15-millisecond timer
  exec ();
}

void TimerThread :: timerEvent(QTimerEvent*)
{
  switch (nTC_Scheduler)
  {
    case 1: GDThread.run (); nTC_Scheduler = 2; break;
    case 2: nTC_Scheduler = 3;
    case 3: SDThread.run (); nTC_Scheduler = 4; break;
    case 4: SDThread.run (); nTC_Scheduler = 1; break;
    default: break;
  }
}

MainWindowThread :: MainWindowThread ()
{
  pthread_setschedprio (pthread_self(), 1);
  Win = new MainWindow ();
  Win->showMaximized ();
}

void MainWindowThread :: run ()
{
  startTimer(1000);     // 1-second timer
  exec ();
}

void MainWindowThread :: timerEvent(QTimerEvent*)
{
  Win->update ();
}

GetDataThread :: GetDataThread () {}

void GetDataThread :: run ()
{
   операции с портами ввода-вывода в реальном времени
}

SendDataThread :: SendDataThread () {}

void SendDataThread :: run ()
{
   операции с портами ввода-вывода в реальном времени
}


Последнее исправление: havenoidea (всего исправлений: 7)

>Ниже привожу листинг программы.

Исправь листинг в стиле LORCODE, а то щас заплюют.

gogi
()

>havenoidea

Нет, ты не понял. Когда ты отвечаешь, у тебя есть выбор внизу типа форматирования текста. Там есть «TeX...», «User line...» и «LORCODE».
Про lorcode: http://www.linux.org.ru/wiki/en/Lorcode
А в сообщение добавь [code=cpp] перед началом кода и [/code] после.

gogi
()
Ответ на: комментарий от panter_dsd

от того что я создал подобную программу с окном в основном потоке, убрав создание MWThread, который создавался ТОЛЬКО для разделения 15мс потока и отрисовки окна, ничего не изменилось. если из основной main функции послать по созданному таймеру update (), то желательно-непрерываемый поток все равно прерывается.

havenoidea
() автор топика
Ответ на: комментарий от panter_dsd

еще нельзя мешать в одну кучу pthread и qthread

Reset ★★★★★
()

И чего, сложно сделать асихнронное even driven приложение и не сношаться с потоками? На выбор: есть сигналы и есть эвенты, просто подписываешься на них из гуя и ждешь событий.

Gorthauer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.