Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 818

/ вопрос открыт /

Здравствуйте, эксперты!

Есть небольшая большая проблема:

Я запускаю в потоке последовательность расчетов.

1. При появлении прерывания, допустим если стработал Assert или другой ShowMessage, эти окна сообщений если появляются, то имеют очень интересные границы формы (или на весь экран, или в ширину\длину, но практически всегда выходящие за рамки экрана ), но не такие как обычно.

2. При срабатывании прерывания также возникают проблемы с закрытием родительской формы. По нажатию на Close кричит "неверный дескриптор файла" или что-то похожее
До внедрения потоков такого вроде бы не наблюдалось.

Очень мешает, подскажите чего пожалуйста.

Aндрей Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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ндрей

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ндрей

Aндрей (статус: 1-ый класс), 20 мая 2009, 15:38 [#4]:

Сори, попутал, конечно это исключения
Вадим К

Вадим К (статус: Академик), 20 мая 2009, 15:41 [#5]:

Assert в потоке без try except - плохо, будут проблемы.
вызов showmessage в потоке без Synchronize - тоже плохо.

P.S. приведённый код ни о чем не говорит. просто какой то набор команд...
Галочка "подтверждения прочтения" - вселенское зло.
Aндрей

Aндрей (статус: 1-ый класс), 20 мая 2009, 16:19 [#6]:

Т.е. по-хорошему мне нужно все исключения в некий буфер сбрасывать, а потом выдавать этот набор ошибок,если мне это необходимо?
Вадим К

Вадим К (статус: Академик), 20 мая 2009, 16:31 [#7]:

Можно и так. Я например использую Outputdebugstring.
Галочка "подтверждения прочтения" - вселенское зло.
Aндрей

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?
Вадим К

Вадим К (статус: Академик), 20 мая 2009, 17:03 [#9]:

а вот это уже другое дело:) я тут даже статью писал... http://www.delphi.int.ru/articles/40/
Галочка "подтверждения прочтения" - вселенское зло.
Aндрей

Aндрей (статус: 1-ый класс), 20 мая 2009, 17:23 [#10]:

Статью прочитал - давно надо было это сделать.
Спасибо за просветляющую деятельность.

А если мне нужно по ходу выполнения выдавать все-таки сообщения, то как быть в этом случае?
Вадим К

Вадим К (статус: Академик), 20 мая 2009, 17:29 [#11]:

можно. через sendmessage и postmessage.
Думаю, после прочтения вот этого http://www.delphi.int.ru/articles/39/ , сразу станет на свои места.
использовать Synchronize не рекомендую. Мало того, что он сделан "Хитро". так он ещё увеличивает связанность юнитов и заставляет писать некрасивый код.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 2 апреля 2020, 02:43
Выполнено за 0.01 сек.
Рейтинг@Mail.ru