The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"создание двух процессов и запуск их по времени (используя С+..."
Отправлено Zulmishan, 25-Сен-09 11:16 
прошу подсказать реализацию нижеописанной задачи (используя C++ в среде Linux).
есть два процесса, один из которых (процесс А) должен запускаться раз в 30 мС, второй (процесс В)должен запускаться раз в 2-3 секунды. процесс А имеет более высокий приоритет по выполнению, чем процесс В (иными словами процесс В может быть прерван процессом А в любое время с последующим возвратом к процессу В). попытки реализации из через организацию таймера (используя stuct sa и timer) не привели к успеху, т.к. хотя процесс В выполняется по времени (запускается), но процесс А все время глючит (в частности при включенном процессе А, в процессе В не работает функция getch (), она всегда завершается с кодом ошибки -1, не ожидая нажатия клавиши клавиатуры)

ниже приведу listing программы

#include "variable.h"

using namespace std;

int main(int argc, char** argv)
{

    int test;

    Set_Timer ();

    initscr ();

    while (1) // main programm circle
    {
            cbreak ();
            test = getch ();
            printf ("%u\n", test);
    }

    endwin ();

    printf("\nmain exit\n");
    return 0;
}

// timer function
void timer_intr(int sig, siginfo_t *extra, void *cruft)
{
// smth system
    struct timespec tmsp;
    clock_gettime(CLOCK_REALTIME, &tmsp);
}

int Set_Timer (void)
{
    // timer set
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_SIGINFO;        // real time signal
    sa.sa_sigaction = timer_intr;    // pointer to action

    if(sigaction(SIGRTMIN, &sa, NULL) < 0)
    {
        perror("sigaction error");
        return 1;
    }

    if (clock_getres(OUR_CLOCK, &resolution) < 0)
    {
           perror("clock_getres error");
           return 1;
    }

    timer_event.sigev_notify = SIGEV_SIGNAL;
    timer_event.sigev_signo = SIGRTMIN;
    timer_event.sigev_value.sival_ptr = (void *)&mytimer;

    if (timer_create(OUR_CLOCK, &timer_event, &mytimer) < 0)
    {
         perror("timer create error");
        return 1;
    }

    clock_gettime(CLOCK_REALTIME, &tmsp);

    i.it_value.tv_sec = tmsp.tv_sec + 2;
    i.it_value.tv_nsec = 0;
    i.it_interval.tv_sec = 0;
    i.it_interval.tv_nsec = 30000000; // 30 ms (timer interval)
    i.it_value = i.it_interval;

    if(timer_settime(mytimer, TIMER_ABSTIME , &i, NULL) < 0)
    {
        perror("settimer");
        return 3;
    }
    return 0;
}

#ifndef VARIABLE_H_
#define VARIABLE_H_

#include <unistd.h>
#include <signal.h>
#include <sched.h>
#include <sys/time.h>
#include <time.h>
#include <curses.h>
#include <stdio.h>
#include <iostream>
#include <sys/io.h>


#define OUR_CLOCK CLOCK_REALTIME
#endif

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, [email protected] (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.

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



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

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