|
Вопрос # 2 818/ вопрос открыт / |
|
Здравствуйте, эксперты!
Есть небольшая большая проблема:
Я запускаю в потоке последовательность расчетов.
1. При появлении прерывания, допустим если стработал Assert или другой ShowMessage, эти окна сообщений если появляются, то имеют очень интересные границы формы (или на весь экран, или в ширину\длину, но практически всегда выходящие за рамки экрана ), но не такие как обычно.
2. При срабатывании прерывания также возникают проблемы с закрытием родительской формы. По нажатию на Close кричит "неверный дескриптор файла" или что-то похожее
До внедрения потоков такого вроде бы не наблюдалось.
Очень мешает, подскажите чего пожалуйста.
 |
Вопрос задал: Aндрей (статус: 1-ый класс)
Вопрос отправлен: 20 мая 2009, 15:15
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 20 мая 2009, 17:29; участников в обсуждении: 3.
|
Ученый (статус: 8-ой класс), 20 мая 2009, 15:26 [#1]:
а код привести....дословно какую ошибку выдает дословно...
так веть даже и не скажешь....причин может быть много....
на счет ShowMessage то у самого как -то возникали такие проблемы именно когда они вызываются прямо из потока....решение нашелтакое: убрать из потока...а вызывать скажем сообщение через отдельную процедуру....
|
|
Вадим К (статус: Академик), 20 мая 2009, 15:32 [#2]:
прерывания... м... а Вы в курсе, что такое прерывания?
То что Вы назвали прерываниями - это исключения.
Вызывать напрямую с потока showmessage - плохая, очень плохая идея.
Assert в принципе тоже. Надо обязательно заворачивать в try except и логировать, например в файл.
Именно по этой причине появляется сообщение о плохом дескрипторе - поток умер, но не до конца, а его пробуют пинать....
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Aндрей (статус: 1-ый класс), 20 мая 2009, 15:35 [#3]:
например,
внутри расчета есть такая комбинация
if ( SteamFlowInputIPS <> 0 )
then if ( PROI1 < 0 )
then begin
Assert(False, 'Неверное значение PROI1!');
Exit;
end;
Так вот не под отладчиком прога вообще исчезает из поля видения и висит только в процессах
код запуска потока
type TSmartThread = class (TThread)
procedure TSmartThread.DoTerminate;
begin
if Assigned(OnTerminate) then OnTerminate(Self);
Self.breakCalculation();
end;
procedure TSmartThread.Execute;
var I: Integer;
//var StartTime: Integer;
begin
inherited;
Synchronize( startCalulation );
// StartTime := GetCurrentTime;
if ( Self.FManager <> nil ) then Self.FManager.Run();
if ( Self.FFormController <> nil ) then Self.FFormController.Run();
Synchronize( stopCalculation );
end;
|
|
Aндрей (статус: 1-ый класс), 20 мая 2009, 15:38 [#4]:
Сори, попутал, конечно это исключения
|
|
Вадим К (статус: Академик), 20 мая 2009, 15:41 [#5]:
Assert в потоке без try except - плохо, будут проблемы.
вызов showmessage в потоке без Synchronize - тоже плохо.
P.S. приведённый код ни о чем не говорит. просто какой то набор команд...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Aндрей (статус: 1-ый класс), 20 мая 2009, 16:19 [#6]:
Т.е. по-хорошему мне нужно все исключения в некий буфер сбрасывать, а потом выдавать этот набор ошибок,если мне это необходимо?
|
|
Вадим К (статус: Академик), 20 мая 2009, 16:31 [#7]:
Можно и так. Я например использую Outputdebugstring.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Aндрей (статус: 1-ый класс), 20 мая 2009, 16:51 [#8]:
попробывал использовать OutputDebugString, т.е
if ( SteamFlowInputIPS_Input <> 0 )
then if ( PROI1 < 0 )
then begin
// Assert(False, 'Неверное значение PROI1!');
OutputDebugString('Неверное значение PROI1!');
Exit;
end;
Перестало приложение исчезать, но сообщение не выдает никакое. Подскажите, пожалуята, где можно глянуть как работать с OutputDebugString?
|
|
Aндрей (статус: 1-ый класс), 20 мая 2009, 17:23 [#10]:
Статью прочитал - давно надо было это сделать.
Спасибо за просветляющую деятельность.
А если мне нужно по ходу выполнения выдавать все-таки сообщения, то как быть в этом случае?
|
|
Вадим К (статус: Академик), 20 мая 2009, 17:29 [#11]:
можно. через sendmessage и postmessage.
Думаю, после прочтения вот этого https://www.delphi-int.ru/articles/39/ , сразу станет на свои места.
использовать Synchronize не рекомендую. Мало того, что он сделан "Хитро". так он ещё увеличивает связанность юнитов и заставляет писать некрасивый код.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|