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