الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إستخدام Thread في فيجوال 2010 لم ينجح!

بدأه Adban في 4 نوفمبر 2010 · 4 رد · 1,600 مشاهدة · في C++.Net
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم جماعة الخير.... :)

بدأت مشروع من نوع المشروع Windows Form Applications على فيجوال 2010...

ثم كتبت دالة تقوووم بعمل حساب رياضي طويل يستغرق قرابة العشر دقائق!!

أقوم بإستدعاء الدالة من خلال زر أنشأته في الفورم الرئيسي

هذا هو شكل البرنامج ببساطة::

post-233812-001104500 1288883528_thumb.p

المشكلة التي أواجهها هو عندما أقوم بضغط الزر (استدعي الدالة) يتوقف البرنامج الرئئيسي عن الاستجابة حتى تنتهي الدالة من الحساب!! أي أن البرنامج يتوقف عن الاستجابة لمدة 10 دقائق!!

حاولت أن أطبق مبدأ ال Thread بهذا الكود

DWORD Pointing;
HWND hWnd= (HWND)this->Handle.ToPointer();

::CreateThread(0,0,(LPTHREAD_START_ROUTINE)MyFunction(hWnd) ,0,0x00000004,&Pointing);

الكود يتنفذ بنجاح ولكن المشكلة لا تزال قائمة!! يتوقف الفورم الرئيسي عن الاستجابة منتظرا تنفيذ الدالة (أو الثريد في حالتنا الأخيرة ) !!

هل من أفكار، مساعدة، حل معين ...

المرفقات
Form.PNG

تم تعديل هذه المشاركة بواسطة Adban في 4 نوفمبر 2010 في 18:22

#2

أخي الكريم

استخدم هذا الكود

while (GetMessage(&msg, NULL, 0, 0)) 
{
	TranslateMessage(&msg);
	DispatchMessage(&msg);
}

تقوم هذه التعليمات بمعالجة الرسائل الواردة إلى المعالج وبالتالي ستستمر النافذة الخاصة ببرنامجك باستقبال وتنفيذ الأوامر الجديدة.

أما إذا كنت تستخدم MFC، استخدم التابع التالي:

void DoEvents()
{
	MSG m;
	while(::PeekMessage(&m, 0, 0, 0, PM_NOREMOVE))
		AfxGetApp()->PumpMessage();

	LONG lIdle = 0;
	while(AfxGetApp()->OnIdle(lIdle++ ))
		;  
}

وقم باستدعائه في كل دورة من دورات العملية الخاصة بك (حقلة while مثلاً).

وإذا لاحظت اسم التابع DoEvents وهي في الأصل تعليمة من تعليمات VB6

ومن ثم أصبحت Application.DoEvents في VB.Net

1

مؤسس شبكة مواقع إجابتي أول شبكة مواقع عربية للأسئلة والأجوبة

#3

أخي بارك الله فيك..أنا أستخدم مشروع من نوع Windows Form Applications على فيجوال 2010 (C++\CLI) فأين أكتب حلقة التكرار التي أشرت لها في ردك بارك الله فيك.

تم تعديل هذه المشاركة بواسطة Adban في 4 نوفمبر 2010 في 20:06

1
#5

شكرا لك جزيلا أخي... ولكن في الحقيقة لم أستطع أن أبصر الحل، لم أعرف أين وكيف أضع كود حلقة الجدولة الذي وضعته وما هي بارامتراته,, كيف أستخدمه كNative وأنا في مشروع CLR..

تم تعديل هذه المشاركة بواسطة Adban في 5 نوفمبر 2010 في 10:48

مواضيع مشابهة