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

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

Почему если из витка ( thread ) создать фору - выдается сообщение [D5, D6, Win2k, WinXP]


Dimk ©   (2002-08-31 21:45:00) 

EInvalidOperation - Canvas does not allow drawing

Проявляется на W2k и выше.
Вот кусок текста
procedure TDelDupThread.Execute;
var
DF: TDelDupForm;
begin
DF := nil;
try
Application.MainForm.Enabled := False;

!!!!!!
DF := TDelDupForm.Create(Application);
!!!!!! тут и вылезает исключение.

DF.Show;
DF.Memo.Text := "


Dimk   (2002-09-02 12:10:00) [1]

Спасибо.


Skier   (2002-09-02 11:54:00) [2]

"Delphi 5. Руководство разработчика" два тома.
То что тебя интересует можно прочитать в 1 томе. стр. 455


Dimk   (2002-09-02 11:50:00) [3]

Если можно - ссылочку или название книг.


Skier   (2002-09-02 11:48:00) [4]

>Dimk

> Вот и интересуюсь - что же там с чем раздирается?

Почитай Тейксейру и Пачеко у них есть подробности по этому
поводу...


Dimk   (2002-09-02 11:42:00) [5]

Дык это я и сам знал - вопрос в том из за чего такое происходит?
Только и всего. Может кто раскопал когдато?

Мне в данном случае это безразлично - но ведь есть нюансы:
например все что вызывается через synchronize выполняется в контексте главного витка - а что в Execute в контексте текущего.

Вот и интересуюсь - что же там с чем раздирается? В чем Суть проблемы?


Skier   (2002-09-02 11:37:00) [6]

>Dimk
Дополнение : я имел ввиду объекты VCL


Skier   (2002-09-02 11:35:00) [7]

>Dimk
Ну тебе же вроде написали что нужен syncronize,т.к. обращатся
к полям, свойствам и методам объектов можно только в контексте
основного потока приложения и syncronize как раз должен помочь...


Dimk   (2002-09-02 11:31:00) [8]

To Skier
Вопрос не о том - читай с самого начала.
Про сплэш я написал чтобы аргументировать почему я не согласен с Юрием Зотовым.


Skier   (2002-09-02 11:23:00) [9]

>Dimk

Не поможет ?


begin
SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
SplashForm.Update;
Application.CreateForm(TTFStatDM, TFStatDM);
Application.CreateForm(TTFStatForm, TFStatForm);
SplashForm.Hide;
SplashForm.Free;
Application.Run;
end.


Dimk   (2002-09-02 11:12:00) [10]

Позвольте снова поднять тему - понедельник, с новыми силами...
:0)


Dimk   (2002-08-31 23:20:00) [11]

В главном витке - формы тоже создаются до входа в цикл обработки сообений:
begin
Application.Initialize;
SplashForm := TSplashForm.Create(Application);

// обратите внимание - сплэщ показывается без проблем!
// потому что Update посылает сообщение прямо в оконную функцию обработки сообщений.
SplashForm.Update;
Application.CreateForm(TTFStatDM, TFStatDM);
Application.CreateForm(TTFStatForm, TFStatForm);
SplashForm.Free;
Application.Run;
end.
Однако это никому не мешает...
И главное исключение не выбрасываются.
Тут какой-то конфликт.
К томуже на w95-98, NT4 все на ура. Это какаято особенность
w2k и выше.


Юрий Зотов   (2002-08-31 23:07:00) [12]

Чтобы форма могла работать, она должна получать сообщения. Для этого поток, в котором она создана должен иметь цикл выборки сообщений. В главном потоке такой цикл реализован в объекте Application.

А в Вашем потоке есть цикл выборки сообщений? Нет. Тогда ничего удивительного.


Dimk   (2002-08-31 22:40:00) [13]

Конфликт налицо...
ProcessMessages перед созданием формы не помогает.

Может SendMessage в главную форму в конструкторе TDelDupForm
сделать - это даст задержку так как из SendMessage не вернестя пока сообщение в главной форме не обработается.

Жаль что в отладчике протрассировать не получается - там видимо из за задержек все проходит нормально.

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


CrazyAngel   (2002-08-31 22:25:00) [14]

из хелпа :
Synchronize causes the call specified by Method to be executed using the main VCL thread, thereby avoiding multi-thread conflicts.
Может и всамом деле конфликтует с основным потоком программы ?


Dimk   (2002-08-31 21:55:00) [15]

Пробовал - не вылазит.
Но мне интересно почему. :0)


CrazyAngel   (2002-08-31 21:51:00) [16]

В хелпе написано что при работе с визуальнами обьектами рекомендуется ипользовать syncronize
Не пробовал с ним тоже вылазит ?


Наверх

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