![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AV при Synchronize в модальной форме. [D7, WinXP]
tytus © (2008-06-09 17:25:00)Доброго дня всем.
Показываю одальную форму:
MForm:=TMForm.Create(Application);
try
MForm.ShowModal;
finally
FreeAndNil(MForm);
end;
В этой форме создаю поток.
Из потока вызываю Synchronize(UpdateRE);
procedure TMyThread.UpdateRE;
begin
with MForm.RE1 do
begin
Lines.Add('какой-то текст');
PostMessage(Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;
end;
Ругается на строкеwith MForm.RE1 do.
В чем тут дело? Ведь в случае сглавной формой никаких проблем нет.
Anatoly Podgoretsky (2008-06-09 21:09:00) [1]> Loginov Dmitry (09.06.2008 20:33:17) [17]
Но в этом случае чудо сработало.
Loginov Dmitry (2008-06-09 20:33:00) [2]> однако чудеса случаются.
случаются. Раз в 100 лет.
Но уж точно не в этом случае ))
Тын-Дын (2008-06-09 20:21:00) [3]Ссылку на форму-то зачем передавать?
Разве не достаточно ссылки на Re1?
tytus (2008-06-09 18:01:00) [4]>tytus (09.06.08 17:46) [10]
заработало!
Всем спасибо!
Поросенок Винни-Пух (2008-06-09 17:59:00) [5]чудес не бывает.
tytus (2008-06-09 17:57:00) [6]>Поросенок Винни-Пух © (09.06.08 17:52) [12]
однако чудеса случаются.
Делал я сей поток с главной формой (для тестирования). Все работает отлично.
Перенес код потока в другое приложение, с модальной формой (думал - какая разница где поток вызывать?) - и вот вам - AV!
Поросенок Винни-Пух (2008-06-09 17:52:00) [7]чудес-то не бывает.
главная или заглавная форма, ав он и в африке ав.
tytus (2008-06-09 17:50:00) [8]>Loginov Dmitry © (09.06.08 17:46) [9]
поток создается в модальной форме при клике на кнопке.
откуда вызывается Synchronize(UpdateRE)?- я думаю большой разницы в этом нет. Что из метода Execute потока, что из какой-нибудь другой процедуры потока - все равно работает. Делал много раз, но только с главной фомой.
tytus (2008-06-09 17:46:00) [9]>Поросенок Винни-Пух © (09.06.08 17:39) [7]
дак мне что - передавать ссылку в поток?
{TMyThread}
private
FForm:TObject;
public
constructor Create(AForm: TObject);
...
constructor TMyThread.Create(AForm: TObject);
begin
FForm:=AForm;
end;
procedure TMyThread.UpdateRE;
begin
with TMForm(FForm).RE1 do
begin
Lines.Add('какой-то текст');
PostMessage(Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;
end;
счаз так попробую... а как по-другому?
Loginov Dmitry (2008-06-09 17:46:00) [10]> В этой форме создаю поток.
> Из потока вызываю Synchronize(UpdateRE);
В какой момент создается поток? Если по OnCreate модальной формы, то в этом момент MForm не определено (особенно высока вероятность AV, если после создания треда происходит длительная задержка). Еще - откуда вызывается Synchronize(UpdateRE)?
Поросенок Винни-Пух (2008-06-09 17:40:00) [11]тысчю раз делал - работает атлична.
Я просто не обратил внимание что там вызов идет через syncronize
остается версия с мусором.
Поросенок Винни-Пух (2008-06-09 17:39:00) [12]это значит в ней нет валидной ссылки на экземпляр класса формы
tytus (2008-06-09 17:39:00) [13]>Поросенок Винни-Пух © (09.06.08 17:37) [4]
тысчю раз делал - работает атлична.
tytus (2008-06-09 17:38:00) [14]>Поросенок Винни-Пух © (09.06.08 17:35) [3]
а то, что с Главной формой приложения метод потока Synchronize работает нормально, а с модальной - нет!
Поясните, что значит в переменной MForm мусор
Поросенок Винни-Пух (2008-06-09 17:37:00) [15]Кроме того, вот этого делать нельзя
procedure TMyThread.UpdateRE;
begin
with MForm.RE1 do
begin
Lines.Add('какой-то текст');
Поросенок Винни-Пух (2008-06-09 17:35:00) [16]И чего?
tytus (2008-06-09 17:31:00) [17]>Поросенок Винни-Пух © (09.06.08 17:27) [1]
вы имеете ввиду что переменная MForm ниначто не ссылается?
Но в юните потока стоит uses MForm;
Поросенок Винни-Пух (2008-06-09 17:27:00) [18]в переменной MForm мусор