0

ここ数週間、私は TSynEdit コンポーネントに基づいたカスタムの社内コード エディターの作成に忙殺されていました。

ユーザー入力を検証し、間違っている可能性のある構文を強調表示するために、エディター行のバックグラウンド処理が必要です。この処理は、メイン フォームのTTimerによって 500 ミリ秒ごとにトリガーされます。

バリデータスレッドは、

std::map<int, String>

行番号/エラーテキスト付き。

TSynEdit の OnSpecialLineColorイベントはマップ内の対応するラインを探しており、IsEmpty()が false の場合、ラインの背景は赤になります。

Synchronize()や一部のWinAPIメッセージを使用せずに SynEdit を十分にスレッドセーフにするために、私の考えは、次のようなコードを使用することでした。

#include <memory>

#define BOOST_THREAD_USE_LIB
namespace boost { extern "C" void tss_cleanup_implemented(void) {}; }
#include <boost/thread.hpp>


class TMySynEdit : public TSynEdit
{
private:
    boost::mutex FMutexLines;

    TStrings* GetLines()
    {
        boost::lock_guard<boost::mutex> guard(FMutexLines);
        return TSynEdit::Lines;
    }

    void SetLines(TStrings* ALines)
    {
        boost::lock_guard<boost::mutex> guard(FMutexLines);
        TSynEdit::Lines = ALines;
    }

public:
    __fastcall TMySynEdit(TComponent* AOwner)
        :   TSynEdit(AOwner)
    {}

    virtual __fastcall ~TMySynEdit()
    {}

    __property TStrings* Lines = {read=GetLines, write=SetLines};
};

TSynEditのプロパティLinesをスレッドセーフ (?) のもので上書きします。

タイマーによってトリガーされるスレッドは、boost::threadで実行される解析関数です。

私の質問は次のとおりです。これは適切な解決策ですか、それともここに何かが欠けていますか?

4

1 に答える 1