Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизThread & dll Найти похожие ветки
← →
TUser (2003-12-24 13:41) [0]Переделываю немножко архитектуру своего проекта. Решил часть кода упихать в dll. В частности, в dll попал поток, который через что-то рисует на форме. Там написано
synchronize(drform); // drform - метод, который осуществлет отрисовку
В юните, где этот поток до сих пор жил, все было нормально. А в dll метод synchronize почему-то не работает - трассировка показывает, что управление методу drform не передается. Все остальное работает нормально, в т.ч. и когда надо из dll что-то сделать с этой формой.
В чем тут дело и как лечить?
← →
TUser (2003-12-24 13:43) [1]Да, кстати, если написать
{synchronize(}drform;//);
то отрисовка происходит, но так писать нельзя, т.к. бывает "Canvas does not allow drawing"
← →
Digitman (2003-12-24 13:45) [2]1. какой кодовый поток хост-процесса в САМЫЙ первый раз вызвал ф-цию из DLL, которая создала TThread ?
2. Чем и как долго занят осн.код.поток хост-процесса в то время как в доп.код.потоке происходит вызов Synchronize() ?
← →
TUser (2003-12-24 13:53) [3]1. Поток в dll создается при ее загрузке. Т.е. так
library ...
...
exports
list;
begin
MyThread1:=TMyThread.Create;
FreeOnTerminate:=true;
Priority:=tpLower;
end;
При загрузке проекта в FormCreate динамически подгружаю dll. Потом Вызываю там процедуру из dll, которая запускает поток (Resume).
2. Основной поток ничем не занят. Тут смысл весь в том, что я почти все функции вывел за пределы основного проекта - в dll, чтобы проще было подгружать разные модули, которые пожелает юзер. В основном проекте остался только PopupMenu, CoolTrayIcon и еще несколько такого рода компонентов.
← →
Digitman (2003-12-24 14:06) [4]
> Основной поток ничем не занят
точно ? т.е. после отработки FormCreate() и последующей визуализации этой формы ты просто ждешь событий польз.интерфейса и не выполняешь никаких циклов и пр. ?
← →
TUser (2003-12-24 14:11) [5]Да, в основном проекте никаких мною созданных циклов нет. Просто жду событий.
Кстати, если вывести код инициализации dll в отдельную процедуру - происходиттот же глюк.
← →
Digitman (2003-12-24 14:14) [6]с какими опциями использования run-time packages построены хост-приложение и библ-ка ?
← →
TUser (2003-12-24 14:28) [7]Не очень понял вопрос. Имеется в виду Project\Options\Packejes\Run-time packajes?
Если да - то там ничего не используется, "Build with ... " не отмечен.
А вообще - должны ли быть различия в использовании метода Synchronize в dll и в обычной программе.
← →
Иван Шихалев (2003-12-24 14:31) [8]> А вообще - должны ли быть различия в использовании
> метода Synchronize в dll и в обычной программе.
Должны быть различия в использовании любых методов любых объектов.
← →
TUser (2003-12-24 14:32) [9]Спасибо, Digitman. Поставил vcl, вроде все заработало.
← →
Digitman (2003-12-24 14:41) [10]
> Поставил vcl, вроде все заработало
если бы ты еще и понял , почему не работало и почему заработало, было бы совсем славно
← →
TUser (2003-12-24 14:53) [11]Ну, видать, прорисовка формы - она же через VCL делается. Вот ей и нужен этот пакет. Наверное.
А если честно - действительно небезынтересно.
← →
Digitman (2003-12-24 15:03) [12]вкратце так :
пока у тебя были сняты эти "галки" в обоих проектах, объекты Application у каждого из них были разные.
после установки "галок" оба модуля стали использовать один и тот же объект Application
внутренний механизм работы метода Synchronize() тесно связан с механизмом выборки/диспетчеризации оконных сообщений, который реализован в объекте Application
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c