![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поток в 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;