ここ数週間、私は 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で実行される解析関数です。
私の質問は次のとおりです。これは適切な解決策ですか、それともここに何かが欠けていますか?