Форум: "Потрепаться";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
ВнизВызов 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c