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

سؤال في Multithread

بدأه bachirk في 17 نوفمبر 2009 · 4 رد · 654 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

لدي الكود الاتي

#include <iostream>
using namespace std;
#include <windows.h>
DWORD WINAPI myThreadFunc1(void*)
{
for ( int j = 1; j < 10; j++){
  cout <<  j << endl;
  Sleep(1000);
}
return 0;
}
//***
DWORD WINAPI myThreadFunc2(void*)
{
for ( int j = 11; j < 20; j++){
  cout <<  j << endl;
  Sleep(1000);
}
return 0;
}
//***
int main()
{
DWORD threadID1,threadID2;
CreateThread(0,0,myThreadFunc1,0,0,&threadID1);
CreateThread(0,0,myThreadFunc2,0,0,&threadID2);
Sleep(10000);
cout << "Program Should End Now !\n";
return 0;
}

في الكود السابق يقوم البرنامج بطبع الاعداد من 1 الى 10 و الدالة الثانية تطبع الاعداد من 11 الى 20

الدالتان تعملان على التوازي

اريد ان اكتب دالة واحدة وامرر لها رقم البداية و النهاية و اجعلها تطبع الارقام من 1 الى 10 ومن 11 الى 20 على التوازي بدون تكرار كتابة الدالة

لقد جربت وضعها في كلاس لكن الطريقة لم تنجح

ارجوا لمن يعلم طريقة او تعليمات لحل المشكل

شكرا مسبقا

#2

يمكنك عمل struct يتكون من القيمه الأولى والأخيره ،، بعدها مرر الstruct للthread وقم بعمل cast داخل الthread من *void الى النوع اللى أنشأته..

struct type {
int x; int y 
};

// in main
struct type t;
t.x = 1;
t.y = 10;

// pass &t to thread
// i don't remmeber the position in parameters :)

// in thread
struct type* t = (type*) v; // v is void pointer
int x =t->x;
int y = t->y;

تقريبا هذه هي الفكرة ، ولا يوجد لدى مترجم الأن للتحقق منها ،،

بالتوفيق ،،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#3

شكرا جزيلا وبارك الله فيك

لكني غير خبير في c++ ارجوا ان احصل على فكرة اوضح

من حيث المصطلحات

وادا كان كود يكون احسن

شكرا ثانية Wajdy Essam جزاك الله خيرا

#4

تفضل أخي الكريم :

// using Win32 Thread 

#include <Windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI MyThread (PVOID pvParam);

// choose one of two method
struct Type { int first; int second; };
//typedef pair<int,int> Type;

int main (int argc, char* argv[]) {
	Type type;

	type.first = 0; type.second = 10;
	CreateThread(NULL, 0, MyThread, (PVOID) &type, 0, NULL);
	Sleep(1000);

	type.first = 11; type.second = 20;
	CreateThread(NULL, 0, MyThread, (PVOID) &type, 0, NULL);

	Sleep(10000);
	return (0);
}

DWORD WINAPI MyThread (PVOID pvParam) {
	Type* t = (Type*) pvParam;

	for (int i=t->first; i<t->second; i++ ) {
		cout << i << endl;
		Sleep(1000);
	}

	return (0);
}

عاده عندما يتطلب ارسال أكثر من قيمه أو أرجاع أكثر من قيمه فيتم وضع تلك القيم في struct أو class ويتم تمرير أو ارجاع هذا التركيب ،،

حاليا الThread يتطلب دالة تستقبل مؤشر من void ويمكن أن تمرر لها ما تريد وقت انشاء الthread .. لذلك ارسلنا لهذا الthread الstruct (يتكون من متغيرين) وفي داخل الthread نقوم بعمل cast ونحول المؤشر من void الى التركيب .. وهكذا نحصل على المتغيرين ..

لاحظ السطر الذي عليه تعليق في الكود :

//typedef pair<int,int> Type;

يمكنك أن تزيل التعليق منه وتضع التعليق على سطر الstruct وسيعمل البرنامج بنفس الشكل .. والpair يمكنك أن تقول عنها أنها struct جاهزه من متغيرين وتستطيع الوصول لهم عن طريق first و second ..

بالتوفيق أخي ..

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 20 نوفمبر 2009 في 19:18

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5

لقد فهمت الفكرة

شكرا جزيلا لقد وفرت على جهد كبير

شكرا على وقتك وجهدك وبارك الله فيك

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