اولا السلام عليكم و رحمة الله و بركاته .
ولكن ياخي الكريم TF6M اين شرط التاكد من عدمه قبل الانشاء من جديد .
ثانيا حتى و لو كنت قد تاكدت من التوقف من الاحسن تحرير ال Thread قبل انشائه مرة جديد يعني استطيع ان استعمل مثلا :
لقول مثلا .
هكذا تجبر النظام ان يوقف التطبيق مهما كانت النتائج حتى باستعمال GetLastError
هنا تقول MS من خلال ال msdn ليس من المستحسن استعمال ال ExitProcess مع ال Threads hاو ال Pip lining لماذا :
يمكن ان يكون هناك Infinit او عملية غير منتهية او مايدعى ال Long Process اذا استعملنا ال ExitProcess فهذا سيجبر التطبيق على التوقف مهما كانت النتائج , ومن بين النتائج الخطيرة هي ال System او Memory instability .
في حالتك يمكن استعمال ال Waitfor و هذا سوف يجبر ال Thread التحقق من اي Operation غير منتهية او من عدم تفريغ ال Quee وهذا سوف يحرر كل ال Ressources قبل تحرير ال Thread
اقول و اعيد انك تقوم بانشاء ال Thread مرتين لماذا تتبع معي ال المشهد :
1* عند بداء التطبيق يتم انشاء ال Thread و لكن Suspended يعني بانتطار اي عملية .
2* عندما اظغط على الزر 2 هذا سوف يقوم بتوقيف ال Thread لزمن معين او Suspended .
3* عندما اظغط على الزر 3 هذا سوف يقوم باعادة تشغيل ال Thread بعدما كان Suspended .
4* عندما اظغط على الزر 4 هذا سوف يقوم بتوقيف ال Thread و انهائه و لكن ليس تحريره يعني ال Handle مازال موجود و ال Ressources مازالت في ال Thread Quee .
*5 عندما اظغط على الزر Start ماذا سيحصل ياترى :
سوف يتم اعادة انشاء نفس ال Thread و الذي اصلا مازال موجود و لم يتم تحريره .
6* OnCloseQuery :
سوف يتم مناداة ال المرحلة 4 و يتم غلق التطبيق . رغم ان ال Thread مازال موجود في الذاكرة اقصد مازال الحيز Reserved .
اذا اما ان نستعمل ال :
FreeOnTreminate في وقت الانشاء مع :
او نتاكد من تحريره في وقت الهدم :
مع : If terminated then free .
او نستعمل ال Waitfor ثم ال free .
لان terminate لا تحرر ال Thread بل توقفه عن العمل .
انظر هنا مثلا
اتمنى ان الفكرة وصلت .
بارك الله فيك و في اخي kachwahed و كل الاعضاء .
و السلام عليكم
إقتباس :[FONT=Arial]كما قلت لك أعدت إنشاءه فقط في حالة إيقافه يعني لا يمكن أن ننشأه مرتين
ولكن ياخي الكريم TF6M اين شرط التاكد من عدمه قبل الانشاء من جديد .
ثانيا حتى و لو كنت قد تاكدت من التوقف من الاحسن تحرير ال Thread قبل انشائه مرة جديد يعني استطيع ان استعمل مثلا :
كود :
if terminated then freeكود :
[COLOR=#0000bb]ExitProcess[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]GetLastError[/COLOR][COLOR=#007700]);[/COLOR][COLOR=#ff8000]//Exit [/COLOR]هكذا تجبر النظام ان يوقف التطبيق مهما كانت النتائج حتى باستعمال GetLastError
هنا تقول MS من خلال ال msdn ليس من المستحسن استعمال ال ExitProcess مع ال Threads hاو ال Pip lining لماذا :
يمكن ان يكون هناك Infinit او عملية غير منتهية او مايدعى ال Long Process اذا استعملنا ال ExitProcess فهذا سيجبر التطبيق على التوقف مهما كانت النتائج , ومن بين النتائج الخطيرة هي ال System او Memory instability .
في حالتك يمكن استعمال ال Waitfor و هذا سوف يجبر ال Thread التحقق من اي Operation غير منتهية او من عدم تفريغ ال Quee وهذا سوف يحرر كل ال Ressources قبل تحرير ال Thread
اقول و اعيد انك تقوم بانشاء ال Thread مرتين لماذا تتبع معي ال المشهد :
1* عند بداء التطبيق يتم انشاء ال Thread و لكن Suspended يعني بانتطار اي عملية .
2* عندما اظغط على الزر 2 هذا سوف يقوم بتوقيف ال Thread لزمن معين او Suspended .
3* عندما اظغط على الزر 3 هذا سوف يقوم باعادة تشغيل ال Thread بعدما كان Suspended .
4* عندما اظغط على الزر 4 هذا سوف يقوم بتوقيف ال Thread و انهائه و لكن ليس تحريره يعني ال Handle مازال موجود و ال Ressources مازالت في ال Thread Quee .
*5 عندما اظغط على الزر Start ماذا سيحصل ياترى :
سوف يتم اعادة انشاء نفس ال Thread و الذي اصلا مازال موجود و لم يتم تحريره .
6* OnCloseQuery :
سوف يتم مناداة ال المرحلة 4 و يتم غلق التطبيق . رغم ان ال Thread مازال موجود في الذاكرة اقصد مازال الحيز Reserved .
اذا اما ان نستعمل ال :
FreeOnTreminate في وقت الانشاء مع :
كود :
Constructor MyThread.Create;
Begin
Inherited Create(Suspended);//If False = start when we call create constructor !.
_i:= 0;//Initialization ...
End;مع : If terminated then free .
او نستعمل ال Waitfor ثم ال free .
لان terminate لا تحرر ال Thread بل توقفه عن العمل .
انظر هنا مثلا
كود :
https://forums.codegear.com/message.jspa?messageID=142218اتمنى ان الفكرة وصلت .
بارك الله فيك و في اخي kachwahed و كل الاعضاء .
و السلام عليكم

