Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Invalid Thread - где копать? [D4, WinXP]


AllDontFire ©   (2005-12-09 12:40:00) 

Привет Всем!
Есть программа в которой используется TTimer и компонента TUDP. В процессе работы программы через некоторое время может выдать сообщение "Invalid Thread ХХХХ$", при этом программа зависает, Ctrl-F2 не помагает, после этого приходится снимать задачу и перезапускать Delphi. Место, в котором произошла ошибка, не показывается (Дебуггер включен, настроен по умолчанию, Компилятору указаны все возможные проверки на Range, OverFlow  и т.д.). Махинаций с TThread нет. Если запускать программу не из среды, то есть Экзе, то этой проблемы нет. Тестировал довольно долго, в Delphi уже бы выдало ошибку, а так ничего не выдаёт, программа работает нормально.

Вопросы:
1)как можно отловить место, в моих модулях(Unit),в котором произошла ошибка. Ес-со, если будет указание на Application.Run или на модули подобные System, то толку не будет.

2)Решит ли проблему переход на более поздний Delphi, например, на пятый?


Игорь Шевченко   (2005-12-12 10:50:00) [1]

jack128 ©   (10.12.05 01:15) [9]


>  И вообще эта доработка - мелочь по сравнению с тем, во
> что они превратили механизм синхронизации


И во что же злобные Борланды превратили механизм синхронизации ?

Хинт: Начиная с D6, TThread начал присутствовать также в CLX.


Defunct   (2005-12-10 12:33:00) [2]

jack128 ©   (10.12.05 01:15) [9]

А можно без эмоций?


jack128   (2005-12-10 01:15:00) [3]

Defunct ©   (09.12.05 13:08) [4]
1. класс TThread там приведен в божеский вид.


Это уродство ты называешь божеским видом??

Defunct ©   (10.12.05 0:36) [7]
поведут себя по-разному в D5 и D6

ну и что?? Я всегда всю инициализацию наследников TThread проводил ПЕРЕД вызовом inherited Create(...) и проблем не имел. И вообще эта доработка - мелочь по сравнению с тем, во что они превратили механизм синхронизации


Alexander Panov   (2005-12-10 01:08:00) [4]

AllDontFire   (09.12.05 12:40)

Есть в среде Delphi то ли глюк, то ли еще что, но некторые программы из под IDE в режиме отладки выпалают с AV. Какой-либо закономерности я не заметил. Может быть у тебя подобная ситуация.


Defunct   (2005-12-10 00:36:00) [5]

Alexander Panov ©   (09.12.05 23:43) [6]

аналогично, но мало ли..
Вы же помните, что

constructor TMyThread.Create;
begin
 inherited Create( false);
 ...
end;

поведут себя по-разному в D5 и D6

AllDontFire   (09.12.05 18:03) [5]
> но я ж хотел узнать решает ли ЭТУ проблему переход на более позднюю среду?

Вполне возможно. В D4 помнится были баги компилятора. Как-то именно в D4 наткнуля на неверное поведение в оператора if.
образно говоря было что-то типа такого:

if a <> 4 then
 <оператор1>
else
 <оператор2>

при A = 4 отрабатывал <оператор1>


Alexander Panov   (2005-12-09 23:43:00) [6]

Defunct ©   (09.12.05 13:08) [4]
1. класс TThread там приведен в божеский вид.


Ну не знаю, не знаю... В D5 не встречался с глюками в TThread.


AllDontFire   (2005-12-09 18:03:00) [7]

Так дело в том, что:
1)Я написал более менее полноценный чат на этой компоненте, в котором этой ошибки никогда небыло, правда там не использутся сильно TTimer.
2)>>Дык, спроси у автора.
я так понял "invalid thread" это сообщение среды(delphi), а не компоненты, связанное с обращением к процессу которого уже нет. И меня интересует ссылка на место в моём коде, которое вызыdает эту ошибку, т.к. сейчас просто всё зависает; мне кажется этот не компонента TUDP выдаёт.
3)to Defunct. спасибо, конечно, но я ж хотел узнать решает ли ЭТУ проблему переход на более позднюю среду?


Leonid Troyanovsky   (2005-12-09 13:08:00) [8]


> AllDontFire   (09.12.05 12:46) [2]

> // mailto://1g0r@ukr.net


Дык, спроси у автора.

--
Regards, LVT.


Defunct   (2005-12-09 13:08:00) [9]

AllDontFire   (09.12.05 12:40)  

Переходите лучше на D6 или D7, по двум причинам:
1. класс TThread там приведен в божеский вид.
2. добавлен набор компонентов Internet Direct (indy) в том числе имеется замечательный компонент для работы по UDP протоколу - TidUDPServer.


AllDontFire   (2005-12-09 12:46:00) [10]

Передача сообщений по протоколу UDP.

// (c) 1g0r  ' 2002
// mailto://1g0r@ukr.net

unit UDP;
interface
uses
 Windows, Messages, Classes, Forms, Winsock, SyncObjs;
const
 CM_SOCKETMESSAGE = WM_USER + $100;
type
 TOnDataReceived = procedure(Sender: TComponent; const Data: String; FromIP: string; Port: integer) of object;
 TOnError = procedure(Sender: TComponent; const ErrCode: Integer) of object;
 TCMSocketMessage = record
   Msg: Cardinal;
   Socket: TSocket;
   SelectEvent: Word;
   SelectError: Word;
   Result: Longint;
 end;
 TSockOptions = class;
 TUDP = class(TComponent)
 private
   FActive: Boolean;
   FLocalPort: Word;
   FRemotePort: Word;
   FRemoteHost: String;
   FHandle: TSocket;
   FWinHandle: THandle;
   FSession: TWSAData;
   FSocketLock: TCriticalSection;
   FOptions: TSockOptions;
   FOnDataReceived: TOnDataReceived;
   FOnReady: TNotifyEvent;
   FOnClose: TNotifyEvent;
   FOnError: TOnError;
 protected
   procedure WMSocket(var Message: TCMSocketMessage); message CM_SOCKETMESSAGE;
   procedure WinsockEvent(var Message: TMessage);
   procedure SetActive(Value: Boolean);
   procedure DoError;
 public
   procedure Lock;
...


DVM   (2005-12-09 12:42:00) [11]


> и компонента TUDP

Это что за компонента такая?


Наверх

Титульная страница Поиск, карта сайта Написать письмо