Имеем приложение + набор DLLок (плагинов).
ICommonPlugin = interface
['{32D97C38-FC25-434A-A25C-B0AAF96F8C69}']
procedure SetValue(Name : String; Value : String);
function GetValue(Name : String) : String;
procedure Run;
end;
В одном из плагинов при вызове Run создается поток,
для создания потока написана (вернее сейчас осталась)
всего одна строчка:
procedure TMyThread.Execute;
begin
FreeOnTerminate := true;
end;
Поток запускаю так:
MyThread := TMyThread.Create(true);
MyThread.OnTerminate := MyThreadTerminate;
MyThread.Resume;
При запуске потока, окно Thread status показывает
... ...
Status ...
... ... Init ...
завершения потока я ждал долго...
Если после Resume добавить ShowMessage('sometext'); (может еще что подойдет, я не проверял)
то все прекрасно работает.
Как мне с этой радостью бороться?
Здравствуйте, Аноним, Вы писали:
А>Имеем приложение + набор DLLок (плагинов).
А>завершения потока я ждал долго...
А>Если после Resume добавить ShowMessage('sometext'); (может еще что подойдет, я не проверял)
А> то все прекрасно работает.
А>Как мне с этой радостью бороться?
Что-то у тебя с синхронизацией... Попробуй вместо ShowMessage написать Sleep(1000). Если тоже "помогает", то похоже проблемы с синхронизацией VCL-потока и создаваемого потока. Напиши подробнее: что у тебя в MyThreadTerminate и т.п.
А>Что-то у тебя с синхронизацией... Попробуй вместо ShowMessage написать Sleep(1000). Если тоже "помогает", то похоже проблемы с синхронизацией VCL-потока и создаваемого потока. Напиши подробнее: что у тебя в MyThreadTerminate и т.п.
Извините, в первый раз был не зарегистрирован.
Sleep(1000) тоже помогло
С остальным описывать нечего т.к. оставил только каркасы
Для MyThreadTerminate
осталось только:
procedure TPHRSpooler.MyThreadTerminate(Sender : TObject);
begin
ShowMessage('Terminated!');
MyThread := nil;
end
;
Без ShowMessage... MyThreadTerminate не вызывается.
конструктор с деструктором убирал совсем
(оставил только Execute c FreeOnTerminate := true)
из основного приложения с плагинами работаю примерно так:
...
var
CommonPlugin : ICommonPlugin;
begin
...
CommonPlugin.Run;
...
end;
Чего не могу понять, так это чем отличается запуск с диалогом от запуска без него?
Например: не создается скрытое окно потока?