В последние несколько недель я был очень занят созданием собственного редактора внутреннего кода, основанного на прекрасном компоненте TSynEdit.
Есть некоторая фоновая обработка строк редактора, необходимых для проверки ввода пользователя и выделения потенциально неправильного синтаксиса. Эта обработка запускается каждые 500 миллисекунд TTimer на основной форме.
валидатор поток перебирает каждую строку, заполняя
std::map<int, String>
с номер строки / текст ошибки.
TSynEdit-х OnSpecialLineColor событие ищет соответствующую линию на карте, и если Пустой() значение false, фон строки становится красным.
Чтобы сделать SynEdit достаточно потокобезопасным без необходимости использования Синхронизация () или несколько WinAPI идея сообщения, моя идея заключалась в том, чтобы использовать какой-то код, подобный этому:
#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 с потокобезопасным (?).
Поток, запускаемый по таймеру, является функцией синтаксического анализа, работающей в повышение :: нить.
Мой вопрос сейчас:
Это адекватное решение, или я что-то здесь упускаю?
Благодаря Реми, я вернусь к не-поточной версии, когда вернусь на работу.
Других решений пока нет …