עבור לתוכן

צריך עזרה קטנה ב-C#

Featured Replies

פורסם

יש לי תרגיל שבו אני אמור לבנות Class שמוצא מספרים ראשוניים בעזרת הנפה של ארטוסתנס, כל מספר שאני מוצא להכניס אותו ל-Class Queue ואח"כ לבנות consumer שקורא את כל המספרים מה-Queue ומדפיס אותם לקונסול.

בקוד שלי בניתי את הנפה שמוצאת את המספרים הראשוניים (ב-main כשבונים את האובייטק מכניסים מספר מסויים למשל 1000 והנפה מוצאת את כל הראשוניים עד 1000) והכנסתי אותם ל-Queue.

מה שלא הולך לי זה ה-consumer ,ואני צריך גם לעשות את זה בעזרת עוד theard (אני צריך להשתמש בזה בתרגיל) שקורא את המספרים ומדפיס.

זה מה שיש לי עד עכשיו:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace T
{
public class Eratosthenes
{
Queue<int> mPrimesQueue = new Queue<int>();
public int mCount = 0;
public int mMaxNumber;
public int mNumberToCheck;
public static int mPrime;
public static List<int> mNumbersList = new List<int>();


public Eratosthenes(int max)
{
mMaxNumber = max;


for (int i = 2; i < mMaxNumber + 1; i++)
{
mNumbersList.Add(i);
}
}


public bool findNum(int number)
{
if (number % mPrime == 0)
{
return true;
}


return false;
}


public void checkIfPrime()
{
List<int> PrimeList = new List<int>();


while (mCount < mMaxNumber-1)
{
if (mNumbersList.Count != 0)
{
mPrime = mNumbersList[0];
for (int i = 0; i < mNumbersList.Count; i++)
{
int NumToCheck = mNumbersList.Find(findNum);
mNumbersList.Remove(NumToCheck);
}


mPrimesQueue.Enqueue(mPrime);
Task QueueTask = new Task(Constumer);
QueueTask.Start();
mNumbersList.Remove(mPrime);
}


mCount++;
}
}


public void Constumer()
{
while (true)
{
if (mPrimesQueue.Count == 0)
{


}
else
{
Console.WriteLine(mPrimesQueue.First());
mPrimesQueue.Clear();
}
}
}
}
}

פורסם

1. ה-consumer צריך להיות בthread משל עצמו

2. הוא צריך לעשות dequeue במקום first ואחכ remove

3. כדאי לתת לו sleep קטן אחרי כל איטרציה.

בהצלחה

פורסם

1. ה-consumer צריך להיות בthread משל עצמו

2. הוא צריך לעשות dequeue במקום first ואחכ remove

3. כדאי לתת לו sleep קטן אחרי כל איטרציה.

בהצלחה

עוד כמה נקודות חשובות

לפני מה שהבנתי הפואנטה של התרגיל היא לכתוב לqueue ולקרוא ממנה במקביל.

הclass והcustomer צריכים לרוץ בthreads נפרדים, הבעייה האמיתית פה, היא המשאב המשותף שהם נגשים אליו והוא הqueue. תחשוב מה יקרה כשאשר תכניס מספר לqueue ובדיוק באותו הזמן תרצה להוציא מספר משם, זה עלול לגרום לנעילה של הthreads. כדי למנוע את זה אתה צריך לנעול ידנית (lock) את הQueue כאשר אתה מוסיף מספרים וגם כאשר את מוציא ממנה מספרים. או להשתמש ב synchronized queue

Queue myQueue = Queue.Synchronized(new Queue());

שעושה את הנעילה בעצמה.

בהצלחה

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים