| 
| 
 | Вопрос # 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 не рекомендую. Мало того, что он сделан "Хитро". так он ещё увеличивает связанность юнитов и заставляет писать некрасивый код.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |