У меня сейчас довольно редкая ситуация. У меня есть приложение, которое напрямую взаимодействует с очередью сообщений Windows. Это приложение также запускает внешние сценарии Lua с LuaJIT. Я хотел иметь средство отладки для этих сценариев, поэтому я создал простое приложение VCL, а затем преобразовал его в библиотеку DLL. Когда первое приложение запускает сеанс отладки с библиотекой, эта DLL создает отдельный поток, где инициализируется и запускается весь объект VCL.Запуск VCL в отдельной теме
procedure TDebuggerThread.Execute;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm (TMainForm, MainForm);
Application.Run;
end;
Поддерживает ли VCL этот способ таким образом? К какому потоку будет TThread.Synchronize (Proc: TThreadProc)
отправить свое сообщение?
Inb4 "сообщения в VCL и в основное приложение будут беспорядочно" - они не будут, потому что каждый поток имеет свою собственную очередь сообщений.
Также вы можете ознакомиться с источниками here. (Возможно) проблемная библиотека называется LuaDebugger
. Вместо надлежащего клиента (Core
, Engine
, Client
) В настоящее время я использую LuaDefaultHost
, что довольно простое консольное приложение, требующее отладчика и ведущее в основном как lua.exe
. С консольным клиентом отладчик работает удивительно гладко - единственная проблема, с которой я столкнулся, заключается в том, что если я закрываю окно консоли во время использования библиотеки, VCL бросает «Обработчик окон уже недействителен» (на русском языке: /). Если я позволю клиенту завершить взаимодействие с отладчиком так, как он должен, все будет хорошо. Вероятно, вызов Windows.TerminateThread
во время завершения модуля должен исправить это.
Либо я что-то упускаю, либо вы получаете доступ и выполняете методы и запускаете очередь сообщений на объекте приложения, созданного в другом потоке. Я бы подумал, что он должен был разбиться раньше .. –
@SertacAkyuz Я тоже так думал. Видимо, VCL более гибкий, чем мы рассматривали.: O Хотя я все еще не пытался использовать библиотеку с клиентом GUI, только с консольным. Вероятно, мне нужно запустить специальный эксперимент, чтобы определить, будет ли VCL по-прежнему использовать очередь основного потока. – Delfigamer
@ Delfigamer Как это сделать VCL? Как VCL может вставить себя в поток, принадлежащий исполняемому файлу? Это не может сделать силой. Это требует сотрудничества от исполняемого файла. У VCL нет концепции основного потока процесса. Существует только поток VCL, этот поток, который инициализировал VCL. –