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

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

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 мусор


Наверх

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