Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

Вызов showmessage из вторичного потока   Найти похожие ветки 

 
Volkov   (2003-12-30 19:43) [0]

Вот заметил тут, что если из вторичного потока вызывать showmessage, ну или там Messagedlg, то часто вылетает исключение EInvalidOperation "Canvas does not allow drawing".

Во-первых, хотелось бы узнать - почему оно возникает.

И во-вторых - как бороться?


 
ИдиотЪ ©   (2003-12-30 19:46) [1]

вызов функций vcl обычно в окаймлении Synchronize должен быть, там же вроде предупреждают об этом


 
jack128 ©   (2003-12-30 19:46) [2]

VCL не thread safe бибилиотека...
читаем про метод Tthread.Synchronize


 
Ihor Osov'yak ©   (2003-12-30 19:48) [3]

хм, а MessageBox религия запрещает?
Ps - MessageBox вполне "thread safe"


 
Volkov   (2003-12-30 20:33) [4]

Ну ладно, это я понял.

А почему возникает ошибка? Ну вызываю showmessage - ну создается форма стандартная... а почему ошибка вылазит?


 
sniknik ©   (2003-12-30 23:43) [5]

> Ну ладно, это я понял.
да ну? ;) а чего спрашиваеш
> а почему ошибка вылазит?

а она пытается в основном потоке создатся, занять ресурс уже занятый это и называется > VCL не thread safe бибилиотека...

популярное прояснение :
представь ситуацию пишеш программу сам и только для себя используеш какуюто переменную, работаеш с ней и сам решаеш что если она в какихто случаях становится равна 0 это плохо, это крах, нужна перезагрузка как единственное средство исправления.
а потом ктото еще пишет программу и у него почемуто есть доступ к твоей переменной и он решил ей воспользоватся (хотя его предупреждали нельзя напрямую нужно только методами и только читать), и он почемуто решил что 0 в этой переменной хорошо а больше нуля плохо, крах, перезагрузка.... (хотя и о 0 ему тоже говорили в хелп посылали)
ну так вот и вторая программа написана и обе запушены паралельно (т.е. одновременно), кто победит? (кто угодно но только не юзер ;о)))
и ведь иногда (чисто случайно) они могут работать вместе (при значениях < 0) но будет ли это правильным? программы работают не перегружаются но чего насчитают?, если будут частично свои а частично другой прграммы данные брать?


 
Volkov   (2003-12-31 00:51) [6]

sniknik, не, чем грозит - я представляю... но вот в данном конкретном случае:

смотрим на showmessage - это тот же MessageDlgPos - MessageDlgPosHelp - CreateMessageDialog.

А вот с CreateMessageDialog сложнее... но может кто знает, что вот вызывается в нем, что приводит к такой ошибке "Canvas does not allow drawing"? И какой канвас? Главной формы? Причем здесь она...


 
Ihor Osov'yak ©   (2003-12-31 02:06) [7]

см. consts.pas line 61: (D5)
SNoCanvasHandle = "Canvas does not allow drawing";
Graphics.pas line 2366:
procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
NeededState: TCanvasState;
begin
NeededState := ReqState - State;
if NeededState <> [] then
begin
if csHandleValid in NeededState then
begin
CreateHandle;
if FHandle = 0 then
raise EInvalidOperation.CreateRes(@SNoCanvasHandle);
end;
if csFontValid in NeededState then CreateFont;
if csPenValid in NeededState then CreatePen;
if csBrushValid in NeededState then CreateBrush;
State := State + NeededState;
end;
end;

Причем есть подозрение, что во всем VCL это единственная строчка, где создается соотв. исключение.
Так что компилируйте с отладочными DCU, ставьте здесь точку останова, и экспериментируйте.. Докопаетесь - здесь расскажите..
Зы - лично я в таких случаях руководствуюсь правилом: люминий - значит люминий. В смысле раз VCL не "thread safe" то нечего ее с разных потоков дергать.. Поверьте, есть намного более интересные вещи, куда свое любопытство можно направить..


 
ИдиотЪ ©   (2003-12-31 08:17) [8]

а действительно отладочные dcu работают с исходниками ?
В каком-то из них я видел пропущенную запятую, даже и не знаю, правда это или нет


 
Alex Konshin ©   (2003-12-31 10:43) [9]

Если ты создаешь окно в другом потоке, то ты должен в том же потоке сделать цикл обработки сообщений. VCL это не сделает.



Страницы: 1 вся ветка

Текущий архив: 2004.01.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 4.369 c
1-63069
Shooraniy
2004-01-08 19:31
2004.01.20
Create???


3-62968
Olivka
2003-12-24 12:49
2004.01.20
Работа с ХП, возвращающими данные через FIBdataset


6-63293
Dimman1
2003-11-12 14:17
2004.01.20
Проблемы с MailSlot


14-63298
Kerk
2003-12-25 12:46
2004.01.20
Где тут логика?


3-63009
new
2003-12-23 08:42
2004.01.20
dataset