LINUX.ORG.RU

Сообщения havenoidea

 

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

Здравствуйте! Прошу помочь разобраться в ситуации!!! Суть задачи такова. Есть два потока. Один каждый 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
()

RSS подписка на новые темы