Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.011 c
7-63415
nollie
2003-11-05 17:17
2004.01.20
asm


11-63044
Boguslaw
2003-05-06 22:04
2004.01.20
Synapse conversion for KOL


1-63249
DimaK
2004-01-08 19:49
2004.01.20
Ошибка ассемблера в XP


3-62966
GIL
2003-12-24 13:09
2004.01.20
Boolean


3-62987
3APA3A
2003-12-24 00:53
2004.01.20
Размер Paradox овской БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский