-1

私はかなり単純な C++ プログラムであるべきものを書こうとしています。それは3つの部分でした:

  1. シリアル クライアント: シリアル サーバーを継続的にポーリングし、受信した値をテーブルに保存する必要があります。シリアル サーバーのポーリングを続行するための無限ループがあります。
  2. ロギング: 現在のテーブル値を、数秒ごとにタイムスタンプ付きの .csv ファイルに書き込みます
  3. メニュー: サーバーを起動/停止し、プログラムを終了するためのシンプルなコマンド ライン メニュー

pthread と boost::thread を使用して、この 3 つの機能を同時に実行しようとしましたが、うまくいきませんでした。

誰かが私にこのすべてについて少し方向性を教えてくれますか?

4

2 に答える 2

1

あなたが求めていることを行う方法は次のとおりです。

boost::mutex mtx;

void poll_thread()
{
    while(!done) {
        poll_for_data();
        if(data_received) {
            boost::unique_lock<boost::mutex> lock(mtx);
            //write data to table
        }
    }
}

void log_thread()
{
    while(!done) {
        sleep(1);
        boost::unique_lock<boost::mutex> lock(mtx);
        //log table to csv file...
    }
}

int main()
{
    //create and start the polling and logging thread
    boost::thread th1(&poll_thread);
    boost::thread th2(&log_thread);

    //run the menu
    while(!done) {
        //...
    }

    th1.join();
    th2.join();

    return 0;
}

異なるスレッドで同時にテーブルにアクセスすることを避けるために、ミューテックスが必要です。

于 2013-05-09T12:43:10.167 に答える
0

これは非常に一般的なシナリオです。

通常、アプリケーションには次のようなメイン スレッドがあります。

  1. シリアル接続をセットアップします。
  2. メニューの操作 (ユーザー入力など)

シリアル接続にはリッスン スレッドがあります。シリアル接続でデータが受信されると、メイン アプリによって処理されるデータ受信イベントが発生します。通常、シリアル ポート通信を簡素化するために、多くの利用可能なライブラリ オブジェクトの 1 つを自由に使用します。これにより、リッスン スレッドを自分でセットアップして管理する手間が省けます。その場合、アプリ イベント ハンドラーをシリアル ポート ハンドラー オブジェクトの DataReceived イベントに接続するだけです。C++ の世界では、最も可能性の高い候補はBoost.Asioです。ここには、適切なサポート記事があるシリアルポート通信オブジェクトの適切な実装もあります: CodeProject Serial library for C++

イベント ハンドラー (シリアル リッスン スレッドで呼び出される) とメイン アプリ スレッドの両方が共有データ (言及したデータ テーブル) にアクセスしている場合は、このオブジェクトへのアクセスを同期プリミティブ (CriticalSection、Mutex など) で保護する必要があります。 avoic 同時アクセス (一方のスレッド (シリアル リッスン スレッド) がデータ構造に書き込みまたは追加している間に、もう一方のスレッド (メイン アプリ スレッド) がデータ構造から読み取りまたはプルを行っている)。

于 2013-05-09T12:25:04.593 に答える