تمت الإجابة انتظار بعض الثواني في كل 50 محاولة من for

تم تحميل الصفحة في 0,3291670 ثانية
انتظار بعض الثواني في كل 50 محاولة من for
الحالة
مغلق و غير مفتوح للمزيد من الردود.
إنضم
20 أكتوبر 2017
المشاركات
608
الإعجابات
405
النقاط
63
السلام عليكم
واجهت بعض المشاكل في Regex
لدي نص كامل ان يستخرج منة بعض الكلمات عن طريق Regex

النص مثلا يكون هاكذا
النص موجود في هذة الرابط
https://pastebin.com/raw/N1NbV8tN

وكود ال Regex

كود:
            Dim re As New System.Text.RegularExpressions.Regex("(?<=""id"": "")(.{1,}?)(?="")")
            Dim Matches As MatchCollection = re.Matches(reqexidfrinds)
            For Each code As Match In Matches



                threadadd = New System.Threading.Thread(AddressOf add)
                threadadd.Start(code.ToString())

            Next
الفكرة ان يستخرج الكلمات المختارة عن طريق كود الRegex
وبعد اتخراجها يتم تشغيل Thread في كل استخراج كلمة
لكن انا في عملي سوف اقوم بأستخراج اكثر من 1000 كلمة وسوف يشغل البرنامج 1000 thread في نفس الثانية

المطلوب :

ان عند الاستخراج مثلا يستخرج 50 كلمة ويتم تشغيل Thread
وبعدها يتم ايقاف الاستخراج موقت بعدد من الثواني مثلا يوقف ب5 ثواني وبعدها يكمل الاستخراج

-------------

محاولاتي :

حاولت استخدام sleep
لكن ان عملتها في الfor سوف يعمل بين كل كلمة وكلمة ثواني انا ريد مثلا بين 50 كلمة

--
وحاولت ايضا انشاء متغير
dim num as string = 0

وفي كل استخراج كلمة يعمل +1
وعند وصولة الى 50 كلمة يستخدم sleep
لكن ماضبطت معي

------
اتمنا وضحت الفكرة
وشكرا
 
إنضم
8 سبتمبر 2013
المشاركات
7,970
الإعجابات
11,895
النقاط
168
الإقامة
Live.IQ(JO => JO.AMMAN)
لو كنت مكانك راح استخدم For لكن مع Functions بيهة Return من نوع bool حتى اضمن التأخير قبل ما ينتقل للخطوة الي بعدها
و همين راح تكون حلقات متداخلة .. الحلقة الرئيسية ممكن تكون من نصيب الخمسين كلمة و الحلقة الي داخلها تخلق الـthreads
و بالنسبة للتأخير 5 ثواني Function مستقل من نوع Task متزامن فيه التأخير من نوع Delay و ليس Sleep و و داخل الحلقة التكرارية For الثانية تحط حلقة تكرارية من نوع While()
و تتحقق كل شوية من متغير من نوع bool داخل Function الـTask يسوي الـقيمة True لهذا المتغير فتنكسر الحلقة و يكون تحقق التأخير المطلوب

اتمنى اني عرفت اساعدك
 
إنضم
27 يناير 2018
المشاركات
582
الإعجابات
528
النقاط
93
استخدم عداد مع critical section أو mutex
يكون العداد خارج الحلقة وبعدها يتم إنشاء ٥٠ خيط وزيادة العداد كل مرة والتحقق من قيمة العداد فإذا كانت ٥٠ قم بمساواته بالصفر ومرر متغير للخيط ٥٠ يجعله يطلب الحصول علي السيكشن وبعد تشغيل هذا الخيط (الخيط الخمسين) انتظر ثامية واحدة واطلب الحصول علي السكشن داخل الحلقة وبهذا لن تعبر هذه النقطة حتي يرجع آخر خيط وهذا علي افتراض أن الخيوط زمن تشغيلها ثابت تقريبا بحيث آخر خيط يكون آخرهم انتهاء

أما إذا لم تضمن أن ينتهي الخيط الخمسين آخرا فاحجز مصفوفة من خمسين مقبض للسكاشن وكل خيط سيعمل بمقبض سيكشن ترتيبه ترتيب العداد حيث قيمته الابتدائية ٠ ونهايته ٤٩
واستخدم WaitForMultipleObjects حتي تنتظر انتهاء الخمسين خيطا

حل آخر باستخدام ما يسمي في c++ promise و future بحيث تمرر كل مرة للخيط بالإضافة إلي النص متغير من نوع future وتستطيع منه معرفة متي انتهي الخيط ومعرفة زمن انتهائه والانتظار حتي انتهائه أو لمدة معينة والحصول علي القيمة التي رجع بها الخيط

وكذلك يمكنك استخدام condition variables حيث ستعمل بالإشارات وهذه الطريقة كما يلي : ستشغل الحلقة ويبدأ العداد العد من ٠ إلي ٤٥ وتتحقق من قيمة العداد فإذا كان ٤٩ وهذا ترتيب الخيط التسعين سيقوم الخيط الأخير بعمل notify وأنت عند تشغيله تستخدم تسغل دالة الانتظار والتي عندما تستقبل الإشارة تدخل لتعليمة continue وتعود لأول الحلقة لتشغل خمسين خيطا آخرين

وهماك أيضا الأحداث events وحتي يمكنك عمل منظم إشارات خاص بك بدون هذه الجاهزة من الويندوز api

وتنبيه أخير : كثرة عدد الخيوط يبطئ البرنامج ويثقل المعالج ويستخدم عند الحاجة لتنفيذ عمليات في نفس الوقت ويستحسن أن لا تكون بهءا الكم الكبير وخاصة أن الخيوط في الدوت نت مكلفة جدا للمعالج وتأخذ مساحة كبيرة من المكدس ووقت تنفيذ المعالج
 
إنضم
20 أكتوبر 2017
المشاركات
608
الإعجابات
405
النقاط
63
لو كنت مكانك راح استخدم For لكن مع Functions بيهة Return من نوع bool حتى اضمن التأخير قبل ما ينتقل للخطوة الي بعدها
و همين راح تكون حلقات متداخلة .. الحلقة الرئيسية ممكن تكون من نصيب الخمسين كلمة و الحلقة الي داخلها تخلق الـthreads
و بالنسبة للتأخير 5 ثواني Function مستقل من نوع Task متزامن فيه التأخير من نوع Delay و ليس Sleep و و داخل الحلقة التكرارية For الثانية تحط حلقة تكرارية من نوع While()
و تتحقق كل شوية من متغير من نوع bool داخل Function الـTask يسوي الـقيمة True لهذا المتغير فتنكسر الحلقة و يكون تحقق التأخير المطلوب

اتمنى اني عرفت اساعدك
استخدم عداد مع critical section أو mutex
يكون العداد خارج الحلقة وبعدها يتم إنشاء ٥٠ خيط وزيادة العداد كل مرة والتحقق من قيمة العداد فإذا كانت ٥٠ قم بمساواته بالصفر ومرر متغير للخيط ٥٠ يجعله يطلب الحصول علي السيكشن وبعد تشغيل هذا الخيط (الخيط الخمسين) انتظر ثامية واحدة واطلب الحصول علي السكشن داخل الحلقة وبهذا لن تعبر هذه النقطة حتي يرجع آخر خيط وهذا علي افتراض أن الخيوط زمن تشغيلها ثابت تقريبا بحيث آخر خيط يكون آخرهم انتهاء

أما إذا لم تضمن أن ينتهي الخيط الخمسين آخرا فاحجز مصفوفة من خمسين مقبض للسكاشن وكل خيط سيعمل بمقبض سيكشن ترتيبه ترتيب العداد حيث قيمته الابتدائية ٠ ونهايته ٤٩
واستخدم WaitForMultipleObjects حتي تنتظر انتهاء الخمسين خيطا

حل آخر باستخدام ما يسمي في c++ promise و future بحيث تمرر كل مرة للخيط بالإضافة إلي النص متغير من نوع future وتستطيع منه معرفة متي انتهي الخيط ومعرفة زمن انتهائه والانتظار حتي انتهائه أو لمدة معينة والحصول علي القيمة التي رجع بها الخيط

وكذلك يمكنك استخدام condition variables حيث ستعمل بالإشارات وهذه الطريقة كما يلي : ستشغل الحلقة ويبدأ العداد العد من ٠ إلي ٤٥ وتتحقق من قيمة العداد فإذا كان ٤٩ وهذا ترتيب الخيط التسعين سيقوم الخيط الأخير بعمل notify وأنت عند تشغيله تستخدم تسغل دالة الانتظار والتي عندما تستقبل الإشارة تدخل لتعليمة continue وتعود لأول الحلقة لتشغل خمسين خيطا آخرين

وهماك أيضا الأحداث events وحتي يمكنك عمل منظم إشارات خاص بك بدون هذه الجاهزة من الويندوز api

وتنبيه أخير : كثرة عدد الخيوط يبطئ البرنامج ويثقل المعالج ويستخدم عند الحاجة لتنفيذ عمليات في نفس الوقت ويستحسن أن لا تكون بهءا الكم الكبير وخاصة أن الخيوط في الدوت نت مكلفة جدا للمعالج وتأخذ مساحة كبيرة من المكدس ووقت تنفيذ المعالج

شكرا على مجهودكم
اسف انا لم ادرس الاساسيات كاملة في البرمجية
ربما انته تقصد شي في تعليقك وانه اعرف بشكل مغاير او انه مفتهمه في شكل مختلف لاني لم ادرس الاساسيات
لكن الان اعرف الكثير من الامؤر المتطوره ولكن لا اعرف Functions او غيرها لاني لم اتعلمها
بلاكثر انا اعمل برامج فقط لمواقع مثلا لتسجيل دخول بموقع فيس بوك في الريكويست او انستغرام او الكثير من المواقع اعرف اتعامل معها واضع الاكواد في الشكل الصحيح لكن الاساسيات لم افهما بشكل
جيد
لو تكملو فضلكم وتعطوني مثلا سورس او كود افهم منه عنده يحل مشكلتي
وشكرا لمجهودكم
 
إنضم
2 أغسطس 2017
المشاركات
167
الإعجابات
126
النقاط
43
الإقامة
Anbar , Iraq
طلبك غير واضح
ع عموم خلي بكل عمليه او ثريد label+1=
بعد مايوصل الليبل الى 50 يسوي ايقاف للثريد Thread.abort
ويشغل تايمر خلي التايمر 5 ثواني بعد مايكمل 5 ثواني يرجع يشغل الثريد من جديد وبأول ثريد يطفي لتايمر وكذا ...
 
إنضم
27 يناير 2018
المشاركات
582
الإعجابات
528
النقاط
93
C++:
vector<string> words; // assume you got the words and stored them in an array

void close_all_handles(HANDLE *handles,int count) {
  for (int i = 0;i < count; ++i) CloseHandle(handles[i]);
}

DWORD WINAPI process_word(void* wd) {
   // do some processing on the string
}

void operate() {
   HANDLE handles[50];
   for(int i = 0; i < 50; ++i) {
      string word = words[i];
      handles[i] = CreateThread(0,0,process_word,word.c_str(),0,0);
      if (i == 49) {
         WaitForMultipleObjects(50,handles,TRUE,INFINITE);
         close_all_handles(handles,50);
      }
   }
   return;
}
التنسيق سيء لأني أكتب من المحمول ليس معي الآن المحرر
 
إنضم
20 أكتوبر 2017
المشاركات
608
الإعجابات
405
النقاط
63
C++:
vector<string> words; // assume you got the words and stored them in an array

void close_all_handles(HANDLE *handles,int count) {
  for (int i = 0;i < count; ++i) CloseHandle(handles[i]);
}

DWORD WINAPI process_word(void* wd) {
   // do some processing on the string
}

void operate() {
   HANDLE handles[50];
   for(int i = 0; i < 50; ++i) {
      string word = words[i];
      handles[i] = CreateThread(0,0,process_word,word.c_str(),0,0);
      if (i == 49) {
         WaitForMultipleObjects(50,handles,TRUE,INFINITE);
         close_all_handles(handles,50);
      }
   }
   return;
}
التنسيق سيء لأني أكتب من المحمول ليس معي الآن المحرر
انا احتاج الكود في لغة vb.net
 
إنضم
27 يناير 2018
المشاركات
582
الإعجابات
528
النقاط
93
C#:
Public Declare Function WaitForMultipleObjects
 Lib "kernel32"  Alias "WaitForMultipleObjects"
(ByVal nCount  As Long, lpHandles
 As Long,  ByVal bWaitAll
 As Long, ByVal dwMilliseconds  As
Long)  As Long


Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
إنضم
27 مايو 2014
المشاركات
297
الإعجابات
391
النقاط
63
العمر
19
الإقامة
Marruecos
وفي كل استخراج كلمة يعمل +1
وعند وصولة الى 50 كلمة يستخدم sleep
لكن ماضبطت معي
لماذا لم تشتغل الطريقة ? جرب تقوم بعملية % على المتغير dim num as string = 0 , اذا كان الناتج 0 فقم بعمل ما تريده ,
المرجو التجربة
 

Ahmed Al'jabari

إداري أقسام البرمجة
rankrankrankrank
إنضم
24 يونيو 2017
المشاركات
1,773
الإعجابات
1,545
النقاط
123
الإقامة
iraq
لم لم يضبط الانتجر عندك ؟ استعمل هاي وصورلي المشكله اذا لم يعمل

كود:
dim ahmed as integer = 0
ahmed +=1
 if ahmed = 50 then
 
 msgbox("Run Thread")
 ahmed = 0
 end if
 
الحالة
مغلق و غير مفتوح للمزيد من الردود.

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل