И снова DLL + потоки
От: Аноним  
Дата: 27.01.05 14:19
Оценка:
Имеем приложение + набор 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'); (может еще что подойдет, я не проверял)
то все прекрасно работает.

Как мне с этой радостью бороться?
Re: И снова DLL + потоки
От: Аноним  
Дата: 27.01.05 16:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Имеем приложение + набор DLLок (плагинов).


А>завершения потока я ждал долго...


А>Если после Resume добавить ShowMessage('sometext'); (может еще что подойдет, я не проверял)

А> то все прекрасно работает.

А>Как мне с этой радостью бороться?



Что-то у тебя с синхронизацией... Попробуй вместо ShowMessage написать Sleep(1000). Если тоже "помогает", то похоже проблемы с синхронизацией VCL-потока и создаваемого потока. Напиши подробнее: что у тебя в MyThreadTerminate и т.п.
Re[2]: И снова DLL + потоки
От: Рома Украина  
Дата: 27.01.05 17:10
Оценка:
А>Что-то у тебя с синхронизацией... Попробуй вместо 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;

Чего не могу понять, так это чем отличается запуск с диалогом от запуска без него?
Например: не создается скрытое окно потока?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.