The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"приоритеты потоков"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"приоритеты потоков"  +/
Сообщение от Миша email(??) on 01-Ноя-10, 13:32 
прошу помочь советом, как сделать приоритеты потоков в приложении с помощью 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("Резерв"));
}

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "приоритеты потоков"  +/
Сообщение от Вова on 01-Ноя-10, 21:02 
> проблема в том, что потоки не получают приоритеты

так вы их не выставляете. То, что вы сделали - переназначаете политику планирования для данного процесса (для ВСЕХ потоков) при создании каждого из потоковых объектов, вам же нужно назначить политику планирования единожды а потокам выставлять приоритеты,
вобщем http://doc.qt.nokia.com/4.6/qthread.html#start

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "приоритеты потоков"  +/
Сообщение от Миша email(??) on 02-Ноя-10, 08:12 
Большое спасибо за совет! Применил что Вы посоветовали, обнако, результат нулевой. Опять же поток отрисовки на экране забивает другой поток как при вызове функции update, так и при переключении закладок (tab_wadget'ов).

// main.cpp
struct sched_param thread_sched_param; //

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

    QApplication app (argc, argv);
    
    TimerThread TThread;
    TThread.start (QThread :: TimeCriticalPriority);
    
    MainWindowThread MWThread;
    MWThread.start (QThread :: IdlePriority);
    
    return app.exec();
}

// threads.h
#ifndef THREADS_H_
#define THREADS_H_

#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;

#endif /* THREADS_H_ */

// threads.cpp
TimerThread :: TimerThread () {}

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

void TimerThread :: timerEvent(QTimerEvent*)
{
    // критичный ко времени цикл.
}

MainWindowThread :: MainWindowThread ()
{
    MainWin = new MainWindow ();
    MainWin -> showMaximized ();
}

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

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

Создается ощущение, что при необходимости перерисовать окно, например при смене заклаток, Linux посылает какое-то сообщение в обход всей очереди и прерывает все что можно лишь бы отобразить на экране обновленное окно, хотя это ну совсем не нужно для данной программы.
Нет ли каких других советов или предложений? Заранее благодарен.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "приоритеты потоков"  +/
Сообщение от Миша email(??) on 02-Ноя-10, 09:44 
а так же создается впечатление, что созданные потоки НЕ выполняются параллельно... каждую секунду поток отрисовки на экран начинает выполнять свое действие и не прерывается пока не выполнится. как буд-то они выполняются последовательно


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

4. "пробуйте использовать другую политику- RR"  +/
Сообщение от Вова on 02-Ноя-10, 10:00 
> а так же создается впечатление, что созданные потоки НЕ выполняются параллельно... каждую
> секунду поток отрисовки на экран начинает выполнять свое действие и не
> прерывается пока не выполнится. как буд-то они выполняются последовательно

это следствие выбранной политики FIFO, попробуйте другую - RR. Задача точно выполнима, я писал тестец на базе примеров из man pthread_attr_init, man pthread_setschedparam и др, если не выставлять приоритеты другим процессам - будет выполняться только заданные потоки, очень милая вещь.

то есть 1) выбираете политику RR  2) если не помогло - пишете сампл на сях,  сравниваете с qthread_unix.cpp из сорцов, понимаете, как от Qt добиться внятного поведения.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "пробуйте использовать другую политику- RR"  +/
Сообщение от Миша email(??) on 02-Ноя-10, 13:57 
пропробывал политику RR результат не изменился, увы...
то, что проблема решаема, притом в рамках библиотеки Qt4.5 я не сомневаюсь, в противном случае на кой вообще разрабатывать библиотеку, которая ломает всю концепцию потенциальной многопоточности программы.
если возможно, нельзя ли получить более конкретную реализацию программы один потом которой что-то выполняет каждый 15мс, другой рисует самое примитивное окошко и обновляет его каждую секунду? заранее спасибо!

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "пробуйте использовать другую политику- RR"  +/
Сообщение от Миша email(??) on 02-Ноя-10, 14:04 
попробывал другую политику (и RR и FIFO) результат одинаков, увы...
то что эта проблема решается, и решается в рамках Qt4.5 я не сомневаюсь, иначе на кой было бы вообще придумывать библиотеку для облегчения программировния, которая по ходу так же ломает все концепцию потенциальной многопоточности программы.
нельзя ли более конкретную реализацию программы двухпоточной, один поток которой каждый 15мс что-то делает (хотябы инкриминтирует переменную, но четко каждые 15мс), другой рисует окошко и каждую секунду его обновляет функцией update, или какой другой функцией.
заранее спасибо, если кто поможет!
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "количество привилегированных потоков"  +/
Сообщение от Вова on 02-Ноя-10, 16:01 

Количество привилегированных потоков должно быть не менее количества ядер в системе, то есть: на однопроцессорной машине при создании одного потока с любым уровнем привилегий вся система подвиснет на время выполнения данного потока, на 4х-ядерной для этого же необходимо выполнение 4х привилегированных потоков.  Соотнесите к своих условиям.

Могу выдать свой сишный тест, все потоки выполняют одни и те же действия, выводится отчёт о количестве проделанной работе за заданное время, очень хорошо заметна разница, только что проверил. Но он на базе манов, можете элементарно повторить самостоятельно!

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "количество привилегированных потоков"  +/
Сообщение от Миша email(??) on 03-Ноя-10, 07:43 
был бы очень признателен за пример на с

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "как-то так"  +/
Сообщение от Вова on 03-Ноя-10, 17:44 
> был бы очень признателен за пример на с

http://codeviewer.org/view/code:1374

#gcc source.c -pthread -lm

далее,

#sudo ./a.out  10 4

запустит 10 обычных потоков, 4 привилегированных, потом будет вывод результатов - какой поток сколько итераций выполнил, в процентах к последнему привилегированному.

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "как-то так"  +/
Сообщение от Миша email(??) on 10-Ноя-10, 08:14 
спасибо за приведенный пример!
однако пока что с Qt ничего подобноого не получается, а проект выполняется именно в рамках этой библиотеки.
если у кого есть пример с Qt4.5 буду очень признателен
Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "как-то так"  +/
Сообщение от guest email(??) on 10-Ноя-10, 13:12 
> если у кого есть пример с Qt4.5 буду очень признателен

Примера нет и в Qt не селен, но влезу)
в коде из первого поста вы дважды меняете политику планировщика для всего процесса sched_setscheduler(), но не разу не выставляете параметры тредов pthread_setschedparam()

Как итог ваши треды абсолютно равноправны для планировщика.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "как-то так"  +/
Сообщение от Миша email(??) on 11-Ноя-10, 16:28 
и да и нет...
да, у обоих потоков приоритет стоял 0. изменил приоритеты на 0 и 20 и ничего не поменялось :(
кстати, функция sched_setscheduler выставляет и политику и приоритеты по описанию...
что же делать еще?

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "как-то так"  +/
Сообщение от guest email(??) on 11-Ноя-10, 18:46 
> да, у обоих потоков приоритет стоял 0. изменил приоритеты на 0 и
> 20 и ничего не поменялось :(

покажите пожалуйста эти кусочки.

> кстати, функция sched_setscheduler выставляет и политику и приоритеты по описанию...
> что же делать еще?

Эта ф-я выставляет политику и приоритет для всего процесса, pthread_setschedparam()/pthread_setschedprio() для конкретной нити процесса.

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

14. "как-то так"  +/
Сообщение от Миша email(??) on 17-Ноя-10, 16:38 
для всего процесса или потока?
чем больше читаю советов, тем больше запутываюсь... :(

правильно ли я понял совет

функция main
{
  ...
  thread_sched_param.sched_priority = 20;
  sched_setschedscheduler (pthread_self (), SCHED_RR, &thread_sched_param);
  ...
  поток 1 ();
  поток 1.start ();
  поток 2 ();
  поток 2.start ();
}

конструктор потока 1
{
  pthread_setschedprio (pthread_self (), 20);
}

поток 1 функция run
{
  startTimer (15);
  exec ();
}


конструктор потока 2
{
  pthread_setschedprio (pthread_self (), -20);
}

поток 2 функция run
{
  startTimer (1000);
  exec ();
}

поток 1 вызывается каждые 15 мс, потом 2 вызывается каждую секунду и может быть прерванным потоком 1.

увы, сделал так, результат нулевой. все равно поток 1 не имеет абсолютного приоритета и поток 2 его прерывает и не отпускает процессор, пока не перерисует окно (с утяжелением отрисовки в окне заметно прерывание первого потока).

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

15. "как-то так"  +/
Сообщение от Миша email(??) on 17-Ноя-10, 16:49 
вот листинг того что опять не работает :D прям и смех и грех

файл // main.cpp

#include <QApplication>

int main(int argc, char* argv[])
{
    QApplication app (argc, argv);

    TimerThread TThread;
    TThread.start ();
    
    MainWindowThread MWThread;
    MWThread.start ();
    
    return app.exec();
}

файл // threads.h

#include "mw.h"

#include <QThread>

extern struct sched_param thread_sched_param;
extern pthread_mutex_t mtx;
extern 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;
    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;

файл // threads.cpp

struct sched_param thread_sched_param;
pthread_mutex_t mtx;
uint8_t nMutex_Check;

GetDataThread GDThread;
SendDataThread SDThread;

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

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(), -20);
    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 ()
{
  обращение к портам (при обращении к портам загорается лампочка, и как раз ее гашение и свидетельствует, что потом MWThread для отрисовки окна прерывает на долгое время приоритетный поток)
}

SendDataThread :: SendDataThread () {};

void SendDataThread :: run ()
{
  подобные как в потоке GetDataThread действия с портами.
}

в главноем окне, описанном в mw.h простой Qtabwindow с 10-15 закладками. в каждом рисуется разные функции графики и подобная ерунда, при переключении закладок как раз особенно видны зависания в передачи управления потоку 1.

такое ощущение, что планировщик не квантует время выполнение и как бы последовательно выполняет то один поток то другой НЕ прерывая второй длинный графический

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

16. "как-то так"  +/
Сообщение от guest email(??) on 17-Ноя-10, 19:09 
> правильно ли я понял совет

Поняли правильно.
Но АФАИР отрицательный приоритет с RR шедулером не имеет смысла.
В остальном не зная особенностей Qt ничего больше вам посоветовать увы не могу.
PS: посмотрел краем глаза в документацию qt - там есть свои штатные возможности управление приоритетами http://doc.qt.nokia.com/4.5/qthread.html#setPriority попробуйте).

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

17. "как-то так"  +/
Сообщение от Миша email(??) on 19-Ноя-10, 08:40 
да, все верно. можно писать поток.start (QT::TimeCritial). но только там приписка, что в linux игнорируются приоритеты и отправляют смотреть sched_setscheduler...

кто-нибудь быть может что посоветует еще?

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

18. "как-то так"  +/
Сообщение от Вова on 19-Ноя-10, 14:32 
> да, все верно. можно писать поток.start (QT::TimeCritial). но только там приписка, что
> в linux игнорируются приоритеты и отправляют смотреть sched_setscheduler...
> кто-нибудь быть может что посоветует еще?

Почему бы не объединить пример на сях и ваш qt-шный гуи? То есть, нарисовать что хотите в гуи + создать в сях поток с любым уровнем приоритета и политикой RR.

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

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

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

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


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


Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

20. "как-то так"  +/
Сообщение от Миша email(??) on 19-Ноя-10, 15:49 
именно так и создается...
создается поток и ставится ему приоритет. конечно попытаюсь сделать поток чисто на С через pthread_create ().
но думаю хрен редьки не слаще будет... :)
Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

21. "как-то так"  +/
Сообщение от Миша email(??) on 23-Ноя-10, 08:54 
c pthread_create () созданным потоком заработало. спс за совет! но теперь надо мыслить почему в QT потоки ну совсем игнорируют повеление программиста быть или не быть приоритетными... ибо программы надо писать, используя QT... так принято на фирме


Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

22. "как-то так"  +/
Сообщение от кошечка on 25-Ноя-10, 12:31 
> c pthread_create () созданным потоком заработало. спс за совет! но теперь надо
> мыслить почему в QT потоки ну совсем игнорируют повеление программиста быть
> или не быть приоритетными... ибо программы надо писать, используя QT... так
> принято на фирме

потому что у вас вся обработка сосредоточена в таймер евентах а они вызываются
из контекста одно и того же таймер треда. по сути в изначальном примере  вы потоки
создаете только для того чтобы зарегистрировать таймер а не для того чтобы делать
обработку в них.

Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

23. "как-то так"  +/
Сообщение от Вова on 25-Ноя-10, 23:15 
>[оверквотинг удален]
>> мыслить почему в QT потоки ну совсем игнорируют повеление программиста быть
>> или не быть приоритетными... ибо программы надо писать, используя QT... так
>> принято на фирме
> потому что у вас вся обработка сосредоточена в таймер евентах а они
> вызываются
> из контекста одно и того же таймер треда. по сути в изначальном
> примере  вы потоки
> создаете только для того чтобы зарегистрировать таймер а не для того чтобы
> делать
> обработку в них.

Скорее всего, так и есть. Или там гуи-поток задерживает выполнение потока таймера, который, в свою очередь не имеет возможности вовремя пронотифицировать "рабочие" потоки.  

Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору

24. "приоритеты потоков"  +/
Сообщение от pavlinux (ok) on 27-Ноя-10, 20:24 
Господя...

> один из которых в реальном времени каждые 15 мс выполняем конкретные действия
> второй каждую секунду рисует на экране
> (пусть рисует сколь угодно медленно, лишь бы не прерывал первый поток).

Компутер ващще дискретное устройство ;)

1 сек = 1000 мс
1000/15 = 66.6666666666666666666666 число иррациональное,
отседа вывод, что таймеры не пересекутся.

main() {

    родить manager_tread()
    manager_tread() рожает first_thread()
    manager_tread() рожает second_thread()
      
}

manager_tread() {

       SET Main_Timer = NOW

       while (1) {
  
          if ( Main_Timer % 15 == 0 )
               SEND SIGNAL TO first_thread();
          if ( Main_Timer % 1000 == 0 )
               SEND SIGNAL TO second_thread();

         sleep(), usleep(), nanosleep(); // по вкусу...
       }

}

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

25. "приоритеты потоков"  +/
Сообщение от pavlinux (ok) on 27-Ноя-10, 21:35 
> приложение состоит из двух потоков, один из которых в реальном времени каждые
> 15 мс выполняем конкретные действия

Ах да, вы видимо оптимист, стабильно 15 мс без RT-Linux не прокатит.
Вот 50-80 можно, и то RedHat ядро.




Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру