PDA

View Full Version : یک مشکل با TIdTCPServer



Delphi Coder
پنج شنبه 02 خرداد 1387, 12:30 عصر
من بعضی مواقع موقع Free کردن TIdCPServer به مشکل Exception برخورد میکنم که اگه madExcept نصب نباشه ویندوز پیغام میده که برنامه باید بسته بشه. madExcept یه همچین چیزی نشون میده:
exception message : Access violation at address 0046B890 in module 'MyServer122.exe'. Read of address 00000022.
thread $11e0:
0046b890 +1c MyServer122.exe Classes 2847 +2 TList.IndexOf
0046baba +12 MyServer122.exe Classes 2908 +1 TList.Remove
0046be13 +2b MyServer122.exe Classes 3143 +3 TThreadList.Remove
00527067 +23 MyServer122.exe IdContext 135 +2 TIdContext.Destroy
00403c28 +08 MyServer122.exe System 8393 +1 TObject.Free
0045be9f +1b MyServer122.exe SysUtils 16274 +3 FreeAndNil
005280f7 +17 MyServer122.exe IdThread 581 +1 TIdThreadWithTask.Destroy
00403c28 +08 MyServer122.exe System 8393 +1 TObject.Free
00475823 +93 MyServer122.exe Classes 9382 +17 ThreadProc
00404ad8 +28 MyServer122.exe System 11562 +33 ThreadWrapper
0044edbd +0d MyServer122.exe madExcept CallThreadProcSafe
0044ee27 +37 MyServer122.exe madExcept ThreadExceptFrame
exception message : Access violation at address 7C84AFB2 in module 'ntdll.dll'. Write of address 00000014.
thread $3f0c:
7c84afb2 +00000 ntdll.dll
7c83d27c +22f1c ntdll.dll RtlEnterCriticalSection
0046bdd0 +00010 MyServer122.exe Classes 3135 +1 TThreadList.LockList
0046bdf7 +0000f MyServer122.exe Classes 3141 +1 TThreadList.Remove
00527067 +00023 MyServer122.exe IdContext 135 +2 TIdContext.Destroy
00403c28 +00008 MyServer122.exe System 8393 +1 TObject.Free
0045be9f +0001b MyServer122.exe SysUtils 16274 +3 FreeAndNil
005280f7 +00017 MyServer122.exe IdThread 581 +1 TIdThreadWithTask.Destroy
00403c28 +00008 MyServer122.exe System 8393 +1 TObject.Free
00475823 +00093 MyServer122.exe Classes 9382 +17 ThreadProc
00404ad8 +00028 MyServer122.exe System 11562 +33 ThreadWrapper
0044edbd +0000d MyServer122.exe madExcept CallThreadProcSafe
0044ee27 +00037 MyServer122.exe madExcept ThreadExceptFrame

به نظر زمانی که Context Thread میخواد Free بشه ThreadList قبل از اون Free شده رفته. ورژن Indy من 10.2.3 هست. وقتی سورس رو نگاه میکنم TerminateAllThreads تو TIdCustomTCPServer منتظر نمیمونه تا همه Context Thread ها تموم و Free بشن فقط همه رو DisConnect میکنه و ادامه میده و بعد میاد تو Destructor کلاس TIdCustumTCPServer همون لیست رو FreeAndNil میکنه در صورتی که این لیست رو Context Thread ها دارن تا موقع Free شدن خودشونو از لیست حذف کنند.
یعنی اتفاقی که میافته ContextThread بعد از Free شدن Contexts که از جنس TThreadList هست کارش تموم میشه و وقتی میاد خودشو حذف کنه Exception میده.
اول میخوام نظر اساتید رو بدونم که آیا مشکل رو درست متوجه شدم یا نه؟ و اگه درسته پروسیجر TerminateAllThreads رو چجوری تغییر بدم تا کارم راه بیافته؟
البته من این مشکل رو یه بار به یکی از برنامه نویسای همین Componen گفتم ولی چون احساس کردم میپیچونه مجبور شدم تا اینجاهم سوالرو مطرح کنم.