私は多くの人気のあるフォーラムでこの問題を尋ねましたが、具体的な回答はありません。私のアプリケーションは、シリアル通信を使用して、それぞれが独自のインターフェイスプロトコルを持つ外部システムとインターフェイスします。システムから受信したデータは、Qt4.2.1で作成されたGUIに表示されます。
アプリケーションの構造は次のようなものです
アプリが起動すると、4つのモジュールを選択できるログインページが表示されます。これは、maindisplayクラスとして実装されます。4つのモジュールはそれぞれ、それ自体が個別のクラスです。ここで関係するモジュールは、さまざまなシステムからのデータの収集と表示を担当するアクションクラスです。
ユーザー認証により、アクション画面が表示されます。アクション画面クラスのコンストラクターが実行され、ありふれた初期化とは別に、シングルトンとして実装されている個々のシステムスレッドが開始されます。
各システムプロトコルは、次の形式のシングルトンスレッドとして実装されます。
class SensorProtocol:public QThread {
static SensorProtocol* s_instance;
SensorProtocol(){}
SensorProtocol(const SensorProtocol&);
operator=(const SensorProtocol&);
public:
static SensorProtocol* getInstance();
//miscellaneous system related data to be used for
// data acquisition and processing
};
実装ファイル*.cpp:
SensorProtocol* SensorProtocol::s_instance=0;
SensorProtocol* SensorProtocol::getInstance()
{
//DOUBLE CHECKED LOCKING PATTERN I have used singletons
// without this overrated pattern also but just fyi
if(!s_instance)
{
mutex.lock();
if(!s_instance)
s_instance=new SensorProtocol();
mutex.unlock();
}
}
実行関数の構造
while(!mStop)
{
mutex.lock()
while(!WaitCondition.wait(&mutex,5)
{
if(mStop)
return;
}
//code to read from port when data becomes available
// and process it and store in variables
mutex.unlock();
}
アクション画面クラスでは、sigactionとsaioを使用してInputSignalHandlerを定義しました。これは、データがいずれかのシリアルポートに到着するとすぐにアクティブになる関数ポインタです。
これはグローバル関数であり(Linuxに固有であるため変更できません)、一致が見つかった場合に、データが到着したシリアルポートのファイル記述子とセンサーシステムのfdを比較するために使用されます。WaitCondition.wakeOneそのスレッドで呼び出され、待機が終了し、データを読み取って処理します。
アクション画面クラスでは、個々のスレッドはとして開始されSensorProtocol::getInstance()->start()
ます。
各システムのプロトコルには、データを送信するフレームレートがあります。この事実に基づいて、アクション画面で、プロトコルのリフレッシュレートでタイムアウトするように更新タイマーを設定しました。これらのタイマーがタイムアウトすると、操作画面のUpdateSensorProtocol()関数が呼び出されます
connect(&timer, SIGNAL(timeout), this,SLOT(UpdateSensorProtocol()));
これにより、センサーシングルトンのインスタンスが次のように取得されます。
SensorProtocol* pSingleton=SensorProtocol::getInstance();
if(pSingleton->mUpdate)
{
//update data on action screen GUI
pSingleton->mUpdate=false; //NOTE : this variable is set to
// true in the singleton thread
// while one frame is processed completely
}
シングルトンインスタンスのすべての使用にSensorProtocol::getInstance()
使用されます。上記のシナリオを考えると、どのような変更を加えても、プロトコルの1つがハングしています。
UpdateSensorProtocol()を使用してデータを表示しているときにハングが発生します。関数にコメントを付けるとShowSensorData()
、正常に機能しUpdateSensorProtocol()
ます。ただし、それ以外の場合はハングし、GUIがフリーズします。助言がありますか!
また、メインスレッドはシングルトンの実行中のインスタンスを取得するため、アクション画面からではありますが、基本的にシングルトン自体のmUpdateを変更しているため、実際にはマルチスレッドですか。
私はこれで混乱しています。
また、誰かが私が今していることに関して別のデザインを提案できますか?
前もって感謝します