прошу помочь советом, как сделать приоритеты потоков в приложении с помощью Qt4.5 следующего характера.приложение состоит из двух потоков, один из которых в реальном времени каждые 15 мс выполняем конкретные действия (приоритетное действие), второй каждую секунду рисует на экране (пусть рисует сколь угодно медленно, лишь бы не прерывал первый поток).
проблема в том, что потоки не получают приоритеты и отрисовка на экране при переключении закладок забивает первый поток.
ниже привожу листинг программы.
// файл main.cpp
#include <QApplication>
#include "threads.h"
int main(int argc, char* argv[])
{
QApplication app (argc, argv);
TimerThread TThread;
TThread.start ();
MainWindowThread MWThread;
MWThread.start ();
return app.exec();
}
// файл threads.h
#ifndef THREADS_H_
#define THREADS_H_
#include <linux/sched.h>
#include <sched.h>
#include <semaphore.h>
#include <pthread.h>
#include <QThread>
#include "mw.h"
extern struct sched_param thread_sched_param;
extern pthread_mutex_t mtx;
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 *MainWin;
void run ();
protected:
void timerEvent(QTimerEvent*);
};
extern MainWindowThread MWThread;
class GetDataThread : public QThread
{
Q_OBJECT
public:
GetDataThread ();
void run ();
};
extern GetDataThread GDThread;
class SendDataThread : public QThread
{
Q_OBJECT
public:
SendDataThread ();
void run ();
};
extern SendDataThread SDThread;
#endif /* THREADS_H_ */
// файл threads.cpp
#include "threads.h"
struct sched_param thread_sched_param;
pthread_mutex_t mtx;
TimerThread :: TimerThread ()
{
thread_sched_param.sched_priority=0;
sched_setscheduler (0, SCHED_RR, &thread_sched_param);
}
void TimerThread :: run ()
{
startTimer (15); // 15-millisecond timer
exec ();
}
void TimerThread :: timerEvent(QTimerEvent*)
{
switch (nTC1)
{
case 1: GDThread.run (); nTC1=2; break;
case 2: nTC1=3;
case 3: SDThread.run (); nTC1=4; break;
case 4: SDThread.run (); nTC1=5; break;
case 5: SDThread.run (); nTC1=6; break;
case 6: SDThread.run (); nTC1=1; break;
default: break;
}
}
MainWindowThread :: MainWindowThread ()
{
thread_sched_param.sched_priority=0;
sched_setscheduler (0, SCHED_IDLE, &thread_sched_param);
MainWin = new MainWindow ();
MainWin -> showMaximized ();
}
void MainWindowThread :: run ()
{
startTimer (1000); // 1000-millisecond timer
exec ();
}
void MainWindowThread :: timerEvent(QTimerEvent*)
{
MainWin -> update ();
}
// файл mw.h
#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_
#include <QMainWindow>
#include <QEvent>
#include <QPainter>
#include <QPushButton>
#include <QTabWidget>
#include <QLabel>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
QTabWidget *tabWidget;
QWidget *tab_1;
QWidget *tab_2;
MainWindow ();
};
#endif /* MAINWINDOW_H_ */
// файл mw.cpp
#include "mw.h"
MainWindow :: MainWindow () : QMainWindow ()
{
QFont font;
setWindowTitle ("MainWindow");
font.setPointSize(14);
tabWidget = new QTabWidget (this);
tabWidget -> setFont(font);
tabWidget -> setObjectName (QString::fromUtf8("tabWidget"));
tabWidget -> setGeometry (QRect (QPoint (5, 5), QSize (790, 590)));
tab_1 = new QWidget();
tab_1 -> setObjectName(QString::fromUtf8("tab_1"));
tabWidget -> addTab(tab_1, QString());
tabWidget -> setTabText (tabWidget -> indexOf (tab_1), QString::fromUtf8("Резерв"));
tab_2 = new QWidget();
tab_2 -> setObjectName(QString::fromUtf8("tab_2"));
tabWidget -> addTab(tab_2, QString());
tabWidget -> setTabText (tabWidget -> indexOf (tab_2), QString::fromUtf8("Резерв"));
}