私は自分自身を少し縛りつけました。私は、メインクラス、シリアルポート処理クラス、およびFFTの実際のパフォーマンスを扱うクラスに分割された、ある種のオシロスコープ型プログラムを作っています。シリアルハンドラクラスでは、boost.Asioの非同期読み取り機能を使用して、シリアルポートからFFT Handlingクラスのメンバ関数に渡したいデータを読み込みます。セットアップは読書のためのかなり標準的です。私は、io_serviceオブジェクトが別のスレッド上で実行されて、読み込むデータがあるときにイベントハンドラを呼び出します。C++イベントハンドラからデータを取り出し、別のクラスのメソッドに渡す?
そこに問題があります。どうやら、私は、async_read_someのイベントハンドラからのデータを別のスレッドの別のクラスのメソッドに渡す方法を見つける必要があります。私はそれが完全に正直である可能性があるかどうかも分かりません。 2つのクラスはメインメソッドに一緒に存在するので、それらの間でデータを渡すことは可能かもしれません。でもそれは不可能でも、望みの効果を達成する方法は何でしょうか?最悪の場合、それらを1つのクラスにマージすることが可能かもしれないと思います。
EDIT:ここでは、すべてのリンクを正確に把握するための簡単な疑似コードを示します。免責事項:私は疑似コードを正しく書く方法を完全にはわかっていないが、私は凶悪化したプログラマーだから分かりにくい場合は教えてください。
//declared globally
boost::mutex mutex_;
sem_t qSem;
queue q;
class SerialHandler{
private:
string portName;
public:
void StartConnection(){
//...some initialization things
AsyncReadSome();
//thread is initiated here
t1 = new boost::thread(boost::bind(&boost::asio::io_service::run, &ioService));
}
//the only important thing here is it reads into a buffer and calls the event after the read
void AsyncReadSome(){
serialPort->async_read_some(boost::asio::buffer(rawBuffer, SERIAL_PORT_READ_BUFF_SIZE),
boost::bind(&SerialHandler::HandlePortOnReceive,
this, placeholders::error,
placeholders::bytes_transferred, q));
}
void HandlePortOnReceive(error_code &ec, size_t bytes_transferred, queue q){
scoped_lock (mutex_); //from boost lib
for (int i=0;i<bytes_transferred;i++){
double d = (double) rawBuffer[i]; //pushes data into queue
q.push(c);
sem_post(&qSem);
}
AsyncReadSome(); //loops back on itself
}
}
class FFTHandler{
private:
double *in; //holds the input array
fftw_complex *out;//holds out array
int currentIndex;
public:
void AppendIn(queue &q, sem_t &_qSem){
while (1){
sem_wait(&_qSem);
double d = q.pop();
in[currentIndex] = d;
if (...){}//some logic to not overflow the in[]
}
}
}
int main(){
FFTHandler fftHandler;
SerialHandler serialHandler;
//...some initialization of global variables goes here
serialHandler.StartConnection();
boost::thread *t2=new boost::thread(boost::bind(&FFTHandler.AppendIn, &fftHandler, &q, &qSem);
char c = getchar();
if (c){call stop functionality}
}
[boost signals](http://www.boost.org/doc/libs/1_61_0/doc/html/signals.html)を見ましたか? – mvidelgauz
@mvidelgauz私はboost :: signals2を一度も使用していないので、私の無知を言い訳しなくてはいけませんが、ドキュメントとチュートリアルの読んで判断すると、どうすればこのイベントハンドラからメインスレッドのクラスにデータを渡します。あなたは精巧にお考えですか? – Scorch
申し訳ありません、現時点では、古いプロジェクトのコードはありません。明日の夜まで誰も答えないなら、私はコードサンプルを見つけようとします。一方、あなたはまたそれのためにGoogleをすることができます(多分 "site:stackoverflow.com"で:-))。私はそれらがたくさんあると確信しています – mvidelgauz