приоритеты потоков с использованием библиотеки 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 ()
{
операции с портами ввода-вывода в реальном времени
}