سؤال

لدي بعض التعليمات البرمجية في C ++ لنظام التشغيل Windows وأعتزم بمنفذها إلى Java. ولكن لسوء الحظ، ليس بالأمر السهل كما اعتقدت. هل يستطيع احد مساعدتي رجاءا؟

من فضلك، ألق نظرة على الخوارزمية:

HANDLE hExitEvent;
HANDLE hDataAvailabeEvent;

while(true)
{
  WaitForMultipleObjects();
  if (hExitEvent is set)
    break;
  if (hDataAvailabeEvent)
  {
    process chunk of data;
    if (all data processed)
      ResetEvent(hDataAvailabeEvent);
  }
}

يمكن ضبط HDataavailabeevent من مؤشرات ترابط مختلفة. إذا تمت معالجة جميع البيانات، فسيقوم بعميات الأحداث وفي استدعاء الخيط WaitFormulipleObjects ستعلق حتى يأتي بيانات جديدة أو وقت خروج الخيط.

لقد رأيت بالفعل سؤال WaitFormulipleObjects في جاوة لكنها غير مناسبة لوضعي لأنني لا أستطيع معالجة جميع البيانات الجديدة في تكرار دورة واحدة ومعالجة ينتشر على بعض التكرارات.

شكرا مقدما!

هل كانت مفيدة؟

المحلول

حل بسيط يبدو أنه يلبي حاجتك هو شيء مثل:

class DataProcessor implements Runnable {
    private final ExecutorService executor = 
        Executors.newSingleThreadedExecutor();

    public void stop { executor.shutdown(); }

    public void process(final Data data){
        executor.execute(new Runnable(){
            public void run(){
                // process data
            }
        });
    }

}

ليس لديك حقا أي أحداث، لكنها تعمل أكثر أو أقل بنفس الطريقة. هل تريد إضافة بيانات إلى قائمة انتظار المعالجة؟ يتصل process و ال executor سوف تعالج الخاص بك Data عند الانتهاء من أي مهام سابقة في قائمة الانتظار. اغلاق؟ يتصل stop و ال executor سوف تنتهي من معالجة كل شيء في قائمة الانتظار، ولكن لن يقبل أي عمل آخر. (إذا كنت بحاجة إلى نهاية مفاجئة، استخدم ExecutorService.shutdownNow).

نصائح أخرى

WaitForMultipleObjects هي وظيفة Windows API. شخصيا سأقوم بتنفيذ هذا عبر أحداث بسيطة (بدلا من الاتصال ResetEvent احصل على نيران الخيوط الخاصة بك من هذا الحدث، ولديه موضوع عامل واحد مسجل للاستماع إلى تلك الأحداث).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top