# Native Code > برنامه نویسی با C > برنامه نویسی با MFC و ++Visual C >  وقتی چند پروسه از این برنامه با هم اجرا می‌شوند، برنامه هنگ میکند؟ چرا؟

## Esikhoob

سلام دوستان
من یک برنامه Windows دارم که بخشی از آن به زبان C#‎‎‎‎‎‎‎‎ MS .NET Framework نوشتم ولی هسته اصلی آن که کار را انجام میدهد توسط شخص دیگری به زبان Win32 نوشته شده است.
مشکلی که در اجرای آن می‌بینم مربوط به سرعت آن میشود. به خاطر نیاز ما لازم است چند تا از این برنامه در سیستم عامل مان در کنار هم اجرا شوند. البته من هر کدام را با یک حساب کاربر Windows Account اختصاصی اجرا کرده ام (با TaskScheduler می‌توان این کار را کرد).
وقتی درخواستی به یکی از آن برنامه محول میشود، در کامپیوتر خودم (Win10) که برای برنامه نویسی است، فوری CPU به 100% میرود و کار شروع میشود ولی در کامپیوتر سرور که مشکل ما در آن اتفاق می‌افتد، در مواقعی اول Disk Activity به 100% میرسد بعد از چند دقیقه به حالت نرمال برمیگردد و بعدCPU به 100% میرود و کار اصلی از آن موقع شروع می‌شود. این مشکل همیشه اتفاق نمی‌افتد و همین کار اشکال یابی را مشکل میکند.
من در لحظه کار نکردن برنامه در  Resource Monitor دیدم مثل اینکه چند پروسه از این برنامه من که اسمش را SDLAutomation.Console.exe گذاشته ام  سر PageFile با هم رقابت میکنند، چون از عکسی که گرفتم این را نشان می‌‌دهد:
pagefile_hang.png

سیستم عامل سرور ما WindowsServer 2012 است. من حدس می‌زنم دوستانی که به زبان ++C آشنا هستند شاید بتوانند با تنظیم سیستم عامل کاری کنند که حافظه ها یا همان Pagefile ها تداخل نکنند. مثلا در صفحه 
System Properties--> Advanced -->  Performance Options ---> Data Execution Prevention
به این تنظیم مشکوک هستم. بخصوص که پیش فرض این تنظیم در Windows Server با Windows 10  فرق میکند و در اولی برای همه برنامه‌ها فعال است.
----
با برنامه مخصوص debug به نام DebugDiag که وضعیت برنامه را در لحظه خطا نشان میدهد گزارشی تهیه کردم ، که قسمت warningی دارد که میگوید:

 Warning 
Number of objects ready for finalization: 476

Description Recommendation 
 This is an indication that your finalizer thread may be blocked. Look at finalizequeue info and finalizer stack to determine why/if the finalizer is blocked

----------


## pe32_64

سلام
مصرف بالای Pagefile  یعنی یکی از موارد زیر:
1- برنامه تون رم بیشتری برا کار کردن نیاز داره .در این مواقع تنها راه حل تهیه رم بیشتر هستش.تنظیمات رو این مورد تاثیر مثبت ندارن.چیزی رو تغییر ندید. 
2- برنامه تون مشکل مدیریت منابع(حافظه) داره که من حدس میزنم مشکل همین هستش. تو زبان های مدیریت شده مثل سی شارپ هم احتمال نشت حافظه یا منابع دیگر هستش. کنترل منابع آسون تر هستش ولی بلاخره نیازه.
در مورد مصرف بالای cpu :
ممکنه در کدتون spin-wait دارید یعنی یک حلقه بی نهایت دارید در جایی از برنامه .اگر برنامه چند نخی هستش باید از توابع synchronization استفاده کنید تا مصرف به 100 نرسه.
اما در کل حل همچین مشکلی *حداقل* به کد کامل هر دو برنامه نیازه. به علاوه داشتن دسترسی به محیط اجرای برنامه هم تاثیر مثبتی داره .
شما که هیچ اطلاعاتی رو  قرار ندادید و این کار رو خیلی سخت میکنه . با این وجود موارد بالا رو در نظر داشته بشید شاید مشکلتون حل شد.

----------


## Esikhoob

از راهنماییتان خیلی ممنون
من در این چند روز که از طرح سوال میگذرد یک به یک احتمالهایی که خودم در بالا داده بودم را رد کردم و فهمیدم که دلیل اشکال نیستند.
من هم با نظر شما موافقم که مشکل مدیریت منابع(حافظه) داریم. این برنامه مثل یک service است (یک exe معمولی است که با روشن شدن کامپیوتر، اجرا میشود) و همیشه اجرا است، هر وقت کاری بیاید انجام میدهد وگرنه منتظر میماند. به نظرم باید سر زمانهایی برنامه را reset کنیم.

----------


## pe32_64

> از راهنماییتان خیلی ممنون
> من در این چند روز که از طرح سوال میگذرد یک به یک احتمالهایی که خودم در بالا داده بودم را رد کردم و فهمیدم که دلیل اشکال نیستند.
> من هم با نظر شما موافقم که مشکل مدیریت منابع(حافظه) داریم. این برنامه مثل یک service است (یک exe معمولی است که با روشن شدن کامپیوتر، اجرا میشود) و همیشه اجرا است، هر وقت کاری بیاید انجام میدهد وگرنه منتظر میماند. به نظرم باید سر زمانهایی برنامه را reset کنیم.


ابزار برا کنترل و مانیتورینگ برنامه برا ویندوز کم یاب نیست  .تشخیص نشت حافظه service تون با این ابزار ها وقعا کار سختی نیست .
ریست کردن که نشد راه حل !

----------


## Esikhoob

> . . . . ریست کردن که نشد راه حل !


بله، من سابقه برنامه نویسی زیاد دارم، ولی تا به حال حتی یک خط هم با ++C  ننوشتم و با نشت حافظه بیگانه ام؛ اما در کار با Windows مهارت بسیار دارم و به یادگیری ++C علاقه بسیاری دارم، برای همین است که از موقع پرسیدن این سوال تا به حال در حال آموزش و مونیتور کردن حافظه Windows با همین ابزارهای مونیتورینگ هستم و به راه حل ساده ریست کردن بسنده نکردم. خوشحالم که میبینم این کار من از دید برنامه نویسان ++C هم درست است.
الان با برنامه Windbg در لحظه hang این برنامه این اطلاعات را بدست آوردم:
0:012> !threads
ThreadCount:      32
UnstartedThread:  0
BackgroundThread: 5
PendingThread:    0
DeadThread:       26
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1  a54 007642d8     2a020 Preemptive  55A1C7AC:00000000 0075e860 0     MTA 
   2    2  848 00774008     2b220 Preemptive  00000000:00000000 0075e860 0     MTA (Finalizer) 
   3    3  f34 03b287a8   8029220 Preemptive  00000000:00000000 0075e860 0     MTA (Threadpool Completion Port) 
   4    4 10b4 03c0aef0   102a220 Preemptive  00000000:00000000 0075e860 0     MTA (Threadpool Worker) 
   8    6  f04 03baa5c0   1020220 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   41    0 00771840   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   47    0 007722d0   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   27    0 00770db0   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   31    0 00771d88   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   46    0 00770868   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   32    0 007712f8   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   21    0 15a57560   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX    5    0 15a5aa30   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   19    0 15a56588   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   45    0 15a555b0   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   26    0 15a55af8   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   48    0 15a57ff0   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   40    0 15a57018   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   38    0 15a54b20   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   13    0 15a59fa0   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   23    0 15a55068   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   15    0 15a59a58   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   35    0 15a5a4e8   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   17    0 15a56040   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX    8    0 15a57aa8   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   12    0 15a58538   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   30    0 15a58a80   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   14    0 15a530b8   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   20    0 15a56ad0   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
XXXX   28    0 15a58fc8   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
  11   16  df8 15a53b48     21220 Cooperative 00000000:00000000 0075e860 0     Ukn 
XXXX   33    0 15a53600   1039820 Preemptive  00000000:00000000 0075e860 0     Ukn (Threadpool Worker) 
0:012> !syncblk
Index         SyncBlock MonitorHeld Recursion Owning Thread Info          SyncBlock Owner
-----------------------------
Total           181
CCW             7
RCW             10
ComClassFactory 1
Free            115
0:012> !DumpHeap -type Interop
 Address       MT     Size
01158e78 72e1ef94       12     
01158ff4 72e1ef94       12     
0115907c 72e1ef94       12     
.
.
.
011590f0 72e1ef94       12     
558390f8 0c8b87a4       12     
55839ac4 0c8b87a4       12     
55839adc 0cc930e8       32     
55842344 0c8b87a4       12     
55842350 0cc954b8       36     
55842bec 0c8b87a4       12     
558432cc 0c8b87a4       12     
55a1c740 72e39ef4       12     

Statistics:
      MT    Count    TotalSize Class Name
72e1edb0        1           12 System.Runtime.InteropServices.GuidAttribute
042ebe54        1           16 SolidFramework.Interop.StringMarshaler
03e8cb1c        1           16 Sdl.MultiTerm.Common.Interop.MtCommonClass
03e8c138        1           16 Sdl.MultiTerm.Server.Interop.MtUtilityClass
03e8ae80        1           16 Sdl.MultiTerm.Server.Interop.MtCatalogServerClass
03e8a9b8        1           16 Sdl.MultiTerm.Server.Interop.MtServerClass
72e39ef4        2           24 System.Runtime.InteropServices.GCHandle
6c8b3850        1           32 System.Runtime.Interop.UnsafeNativeMethods+EtwEnab  leCallback
03e8cdc0        2           32 Sdl.MultiTerm.Server.Interop.MtSearchCountClass
03e8bf78        2           32 Sdl.MultiTerm.Server.Interop.MtSearchExClass
03e8bbc0        2           32 Sdl.MultiTerm.Server.Interop.MtTermbaseClass
72e3792c        3           48 System.Runtime.InteropServices.HandleRef
72e1ef94       14          168 System.Runtime.InteropServices.ComVisibleAttribute
0cc930e8      188         6016 Sdl.FileTypeSupport.Filters.MicrosoftOffice.Previe  w.PowerPoint.PowerPointInteropFacade
0cc954b8      282        10152 Sdl.FileTypeSupport.Filters.MicrosoftOffice.Previe  w.Excel.ExcelInteropFacade
0c8b87a4      846        10152 Sdl.FileTypeSupport.Filters.MicrosoftOffice.Previe  w.Helpers.OfficeInteropLoader
Total 1348 objects


من در تفسیر این مطالب عاجزم، آیا تعداد DeadThread: 26 طبیعی است؟
با CCW  7 و RCW  10  باید چه کار کرد؟

----------

