Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поток в dll [D7, Win2k]


alexnmsk ©   (2008-02-13 11:24:00) 

Здравствуйте, уважаемые мастера.
Имеется dll, в которой экспортируемая функция создает форму (хранится в этой же dll), и вызывает ее ShowModal. В этой форме нужно выполнять определенные действия в отдельном потоке. Для примера вот код в юните потока:

procedure TMyThread.ClearList;
begin
EOBJ.Label1.Caption:='1111';
EOBJ.Label1.Caption:='1111';
end;

procedure TMyThread.ClearList2;
begin
EOBJ.Label1.Caption:='2222';
EOBJ.Label1.Caption:='2222';
end;

procedure TMyThread.Execute;
begin
   Synchronize(ClearList);
   Synchronize(ClearList2);
end;

в форме по нажатию кнопки, пытаюсь создать поток:

procedure TEOBJ.Button1Click(Sender: TObject);
var
 t: ThRefreshPictureList;
begin
 t := ThRefreshPictureList.Create(False);
end;

При выполнении никаких изменений в Label1 и Label2 не происходит. Поток запускается, но Synchronize(ClearList2) даже не выполняет. ???


DiamondShark   (2008-02-13 18:01:00) [1]


> Объекты Application у вызывающего и вызываемого модулей
> разные, потому и не работает Synchronize()

Это что ж такого с синхронайзом сотворили в семёрке?!

В пятой было всё просто, как редиска:

procedure TThread.Synchronize(Method: TThreadMethod);
begin
 FSynchronizeException := nil;
 FMethod := Method;
 SendMessage(ThreadWindow, CM_EXECPROC, 0, Longint(Self));
 if Assigned(FSynchronizeException) then raise FSynchronizeException;
end;

Никакой зависимости от Application тут не наблюдается.


Leonid Troyanovsky   (2008-02-13 13:25:00) [2]


> Anatoly Podgoretsky ©   (13.02.08 12:14) [8]

> верный последователь Архангельского.

И продолжатель :)
Не только overSynchronize и форма в длл, но и поток туда ж.

--
Regards, LVT.


Anatoly Podgoretsky   (2008-02-13 12:14:00) [3]

> alexnmsk  (13.02.2008 11:24:00)  [0]

Наш клиент и верный последователь Архангельского.


clickmaker   (2008-02-13 11:57:00) [4]


> [5] alexnmsk   (13.02.08 11:44)

не лень шоумесседж-то столько раз писать?
давно бы отладчиком прошелся...


Сергей М.   (2008-02-13 11:46:00) [5]

Объекты Application у вызывающего и вызываемого модулей разные, потому и не работает Synchronize()

Уж сколько раз твердили миру - Делфи-формы следует хранить и создавать в bpl, а не в dll !


alexnmsk   (2008-02-13 11:44:00) [6]

Я так понимаю, что дело во взаимодействии со свойствами объектов, потому что

procedure ThRefreshPictureList.ClearList;
begin
showmessage('1');
showmessage('2');
EOBJ.Label1.Caption:='1111';
showmessage('3');
EOBJ.Label2.Caption:='1111';
end;

showmessage('3') - даже не вызывается


clickmaker   (2008-02-13 11:43:00) [7]


> но Synchronize(ClearList2) даже не выполняет

в отладчике не заходит в ClearList2?


alexnmsk   (2008-02-13 11:35:00) [8]

тоже опечатка
EOBJ.Label1.Caption:='1111';
EOBJ.Label2.Caption:='1111';


clickmaker   (2008-02-13 11:33:00) [9]


> EOBJ.Label1.Caption:='2222';
> EOBJ.Label1.Caption:='2222';

а с первого раза не присваивается? )


alexnmsk   (2008-02-13 11:30:00) [10]

Опечатался. По нажатию кнопки:

procedure TEOBJ.Button1Click(Sender: TObject);
var
t: TMyThread;
begin
t := TMyThread.Create(False);
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо