2014-01-27 3 views
0

У меня есть функция f1, которая работает в потоке, и она непрерывно выполняет расчет c1.Обработка события в текущей нити

Но когда к нему приходит специальное событие, f1 должен выполнить расчет c2 (вместо вычисления c1).

Как это реализовать? Я много искал, случай производителя-потребителя или условные блокировки не подходят для моей реализации (я так думаю), потому что я не хочу, чтобы поток останавливался до тех пор, пока событие не произойдет.

Может кто-нибудь мне помочь?

Спасибо заранее

class myclass 
{ 
    void f1 (void) 
    { //I do not want the f1 stop, it has to do its work, and when f2 send an event to him, act different 
     while (1) { 
      if(there is an event from f2) 
       do c2; 
      else 
       do c1; 
      // I do not want to loose any event either 
     } 
    } 

    void f2(void) 
    {//f2 runs in parralel to f1 
    } 

    void execute() 
    { 
     // f1_thread do calculations (c1) continiously 
     boost::thread* f1_thread = new boost::thread(boost::bind(&myclass::f1, this)); 
     // f2_thread has to send an event to force the f1_thread (once a while) to do calculation c2 instead of c1 
     boost::thread* f2_thread = new boost::thread(boost::bind(&myclass::f2, this)); 
    } 
} 
int main() 
{ 
    myclass _myclass; 
    _myclass.execute(); 
} 

Я хочу «F1» стоп «c1» расчеты и сразу же перейти на расчет c2, когда «f2» послать ему сигнал (я не знаю, о сигналах пока). расчет c1 очень трудоемкий, и если я использую предложение «if», когда происходит событие, «c2» не может быть запущен до тех пор, пока не закончится «c1».

+1

не могли бы вы ответить на меня вместо голосования -1? Я новичок в потоках, и я хочу начать использовать события. Если вопрос такой простой, напишите ответ. спасибо –

+0

Это * «причина, по которой я не хочу использовать« если », заключается в том, что мои вычисления очень трудоемки, и если я использую« if », когда происходят изменения из f2, f1 не заметит его до следующего раунда. '* не имеет абсолютно никакого смысла - попробуйте объяснить более четко. –

+0

@JohannGerell Спасибо за внимание, я хочу, чтобы «f1» остановил вычисления «c1» и сразу переключился на расчет c2 всякий раз, когда «f2» отправил ему сигнал (пока я еще не знаю о сигналах). расчет c1 очень трудоемкий, и если я использую предложение «if», когда происходит событие, «c2» не может быть запущен до тех пор, пока не закончится «c1». Надеюсь быть ясным. Спасибо –

ответ

1

Пока еще информация не задана в вопросе, вы пробовали какие-либо изменения в теме «простая замена указателя функции»?

typedef void (*CALC_FUNC)(); 

void c1() { ... } 
void c2() { ... } 
volatile CALC_FUNC calcFunc; 

class myclass 
{ 
    void f1 (void) 
    { 
     while (1) { 
      // Provided that your platform's function pointer 
      // assigment is atomic (otherwise do an interlocked 
      // operation) 
      CALC_FUNC func = calcFunc; 
      func(); 
     } 
    } 

    void f2(void) 
    { 
     // Provided that your platform's function pointer 
     // assigment is atomic (otherwise do an interlocked 
     // operation) 
     if(someCondition) calcFunc = c2; 
     else if(someOtherCondition) calcFunc = c1; 
    } 

    void execute() 
    { 
     calcFunc = c1; 

     // f1_thread do calculations (c1) continiously 
     boost::thread* f1_thread = new boost::thread(boost::bind(&myclass::f1, this)); 
     // f2_thread has to send an event to force the f1_thread (once a while) to do calculation c2 instead of c1 
     boost::thread* f2_thread = new boost::thread(boost::bind(&myclass::f2, this)); 
    } 
} 
+0

Это полезный ответ, но я хочу, чтобы вычисление типа «c1» сменилось на тип «c2». Есть ли другая идея? еще раз спасибо. –

+0

Вы не можете изменить его более немедленно. Код в каждом из c1 и c2 должен выполняться и возвращаться до использования нового «калькулятора». Единственный способ изменить то, что происходит * внутри *, - это в основном сделать то же самое, что и сменять указатель на функцию (изменить «стратегию расчета»). –

Смежные вопросы