Межплатформенный эквивалент событиям окон

Вот то, почему:

  • Человекочитаемый. Это делает намного легче определить ошибку, и в файле и в методе парсинга. Также может быть считан вслух. Это - то, которое Вы просто не можете получить с XML и могли бы иметь значение, особенно в поддержке клиентов.

  • Страховка от устаревания. Целых regex существуют, возможно записать довольно хороший синтаксический анализатор во всего нескольких строках кода.

  • Рычаги. Почти все там, от систем управления версиями до редакторов для фильтрации, может осмотреть, объединиться и воздействовать на плоские файлы. Слияние XML может быть путаницей.

  • Способность интегрировать их скорее легко с инструментами UNIX, такими как grep, сокращение или sed.

23
задан Fire Lancer 4 November 2009 в 22:18
поделиться

6 ответов

Я думаю, что хорошим кроссплатформенным эквивалентом событий win32 является boost :: condition , поэтому ваш код может выглядеть примерно так:

void foo()
{
    boost::mutex mtxWait; 
    boost::condition cndSignal;

    bCall(boost::bind(&bar, mtxWait, cndSignal));

    boost::mutex::scoped_lock mtxWaitLock(mtxWait);
    cndSignal.wait(mtxWait); // you could also use cndSignal.timed_wait() here
}

void bar(boost::mutex& mtxWait, boost::condition& cndSignal)
{
    doSomething();
    cndSignal.notify_one();
}
10
ответ дан 29 November 2019 в 02:01
поделиться

вы можете использовать ускоряющий поток барьер

#include <boost/thread/thread.hpp>
#include <boost/thread/barrier.hpp>
#include <iostream>

void foo(boost::barrier* b)
{
  std::cout << "foo done" << std::endl;
  b->wait();
}


int main()
{
  std::cout << "start foo" << std::endl;
  boost::barrier b(2);

  boost::thread t(&foo, &b);
  b.wait();
  std::cout << "after foo done" <<  std::endl;
  t.join();
}
2
ответ дан 29 November 2019 в 02:01
поделиться

Я делал (или видел) все следующее в разное время для подобных вещей:

Используйте мьютекс + условную переменную.

Используйте канал, имея foo создайте канал и передайте его конец записи в bar. Бар затем записывает в трубу, когда бар готов. (Это даже работает с несколькими процессами.)

Проведите опрос foo для логического значения (да, это плохая идея).

0
ответ дан 29 November 2019 в 02:01
поделиться

All these answers are too complex, come on people it isn't that hard.

namespace porting
{
   class Event;
   typedef Event* Event_handle;
   static const unsigned k_INFINITE = 0xFFFFFFFF;

   class Event
   {
      friend Event_handle CreateEvent( void );
      friend void CloseHandle( Event_handle evt );
      friend void SetEvent( Event_handle evt );
      friend void WaitForSingleObject( Event_handle evt, unsigned timeout );

      Event( void ) : m_bool(false) { }

      bool m_bool;
      boost::mutex m_mutex;
      boost::condition m_condition;
   };

   Event_handle CreateEvent( void )
   { return new Event; }

   void CloseHandle( Event_handle evt )
   { delete evt; }

   void SetEvent( Event_handle evt )
   {
      evt->m_bool = true;
      evt->m_cond.notify_all();
   }

   void WaitForSingleObject( Event_handle evt, unsigned timeout )
   {
      boost::scoped_lock lock( evt->m_mutex );
      if( timeout == k_INFINITE )
      {
         while( !evt->m_bool )
         {
            evt->m_cond.wait( lock );
         }
      }
      else
      {
         //slightly more complex code for timeouts
      }
   }

}// porting

void foo()
{
   porting::Event_handle evt = porting::CreateEvent();
   bCall( boost::bind(&bar, evt ) );
   porting::WaitForSingleObject( evt, porting::k_INFINITE );
   porting::CloseHandle(evt);
}

void bar( porting::Event_handle evt )
{
   doSomething();
   porting::SetEvent(evt);
}

There is probably a bit more to do to get this fully working as I'm not familiar with the semantics of WaitForSingleObject (what happens if two threads call it at the same time, what happens if the same thread calls it twice). However, the solution will look very much like this.

15
ответ дан 29 November 2019 в 02:01
поделиться

Похоже, Вы ищете механизм сигнальных слотов. Вы можете найти его в:

boost и Qt

, кроссплатформенные.

Пример Qt:

 #include <QObject>

 class Counter : public QObject
 {
     Q_OBJECT
 public:
     Counter() { m_value = 0; }

     int value() const { return m_value; }

 public slots:
     void setValue(int value);

 signals:
     void valueChanged(int newValue);

 private:
     int m_value;
 };

Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
                  &b, SLOT(setValue(int)));

a.setValue(12);     // a.value() == 12, b.value() == 12
b.setValue(48);     // a.value() == 12, b.value() == 48

void Counter::setValue(int value)
{
    if (value != m_value) {
        m_value = value;
        emit valueChanged(value);
    }
}
0
ответ дан 29 November 2019 в 02:01
поделиться

В системах, совместимых с Posix, вы можете использовать Posix IPC. Он используется для обмена сообщениями между процессами и потоками. Если я правильно помню, доступен порт cygwin.

-1
ответ дан 29 November 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: