PDA

View Full Version : سورت با مولتی ترد



اتوسا
دوشنبه 30 مهر 1386, 18:31 عصر
دوستان لطفا اگر در مود ای مساله اطلاعاتی می توانید بدهید دریغ نکنید نیمدونم جای درستی مطرح شده با نه:
باید یک اپلایکشن بنویسم که 1000 تا عدد بگیره سه نوع SORT را انجام بدهد مثل سورت سریع و...که به صورت مولتی ترد باید پیاده شود وباید رشد شو با یه نمودار گرافیکی نشون بده (هر سه تا سورت رو باهم) چه طوری لین کار رو انجام بدم .

vcldeveloper
سه شنبه 01 آبان 1386, 02:28 صبح
عنوان بخش هست توسعه سیستم عامل، خودتون فکر می کنید اصلا این بحث ربطی به توسعه سیستم عامل داشته باشه؟!!
اگر با دلفی کار میکنید، در Demo های دلفی برنامه ایی وجود داره که دقیقا این کاری که می خواید رو انجام میده.

vbprogrammerx
یک شنبه 06 آبان 1386, 21:58 عصر
سلام
اول یه سوال:
شما با چه زبونی می خواهید این برنامه رو پیاده سازی کنید؟
اما به هر حال اگه می خواهید بایکی از زبانهای مجموعه ی .Net
(مثل VB.Net , یا #C و یا ++VC ) می خواهید بنویسیدش راه حل خیلی آسونه کافیه یه سری به MSDN ویزوال استادیو بزنید و کلمه ی thread و یا thread implementation را جستجو کنید کلی براتون نتیجه میاره
در حالت کلی شما باید یه تابع تعریف کنید که این تابع بدنه ی نختون می شه بعدش با ید یه شی از کلاس Thread تعریف کنید
بعدشم اونو run یا start کنید
مثلا در #C باید به اول پروزه اضافه کنید:

using System;
using System.Threading;
و اگه مثلا اسم تابع بدنه ی نخ threadproc باشه
برای تعریف شی داریم:

Thread t1 = new Thread(new ThreadStart(threadproc));
برای اجرای نخ هم داریم:

t1.start();
امیدوارم مشکلتون حل بشه
اگه نشد بازم همین جا تاپیک بزنید

اتوسا
دوشنبه 07 آبان 1386, 17:25 عصر
مرسی دوست عزیز بابت توجهتون .اون چیزایی روکه شما گفتید میدونستم.موضوع اینکه اگه قراره تو محیط console application این کار رو بکنیم(درسته ؟) چه طور 1000 تا عنصر رو تو یه ارایه بریزم چون فضای ارایه(system.array) نداریم .

vbprogrammerx
دوشنبه 07 آبان 1386, 20:58 عصر
سلام
لزومی نداره توی محیط کنسول بخواهی این کارو انجام بدی تازه توی win app باشه بهتره چون می تونی گرافیکی نتیجه رو نشون بدی
حالا با فرض اینکه بخوای توی consol app این کارا انجام بدی(که توصیه نمیشه)نیازی به system.array نیست می تونی به راحتی برنامه ی مثالی زیر این کا رو انجام بدی

using System;
using System.Collections.Generic;
using System.Text;


namespace ConsoleApplication7
{
class Program
{
public static void bubble(/*parameters*/)
{
//code
}
int mymax = 10000;
static void Main(string[] args)
{
Random rnd = new Random() ;

int[] a = new int[mymax];
for (int i = 0; i < max; i++)
a[i]= rnd.Next ();


}
}
}

راستی نگفتی با چه زبونی می خوای کد بنویسی؟VB.net or Csharp

vbprogrammerx
دوشنبه 07 آبان 1386, 21:04 عصر
using System;
using System.Threading;

public class ThreadExample
{

public static void bubble()
{
Random r = new Random();
const int Max = 100;
long[] x = new long[Max];
long t,i,j;
for (long ii = 0; ii < Max; ii++)
{
x[ii] = r.Next();//initialize x[ii]

}
for (i = 1; i < Max; i++) //begin of sort
for (j = Max - 1; j >= i; j--)
if (x[j - 1] > x[j])
{
// exchange elements
t = x[j - 1];
x[j - 1] = x[j];
x[j] = t;
} //end of sort
Console.WriteLine("End of Bubble Sort***************************");
for (long k = 0; k < Max; k++) //showing result
Console.WriteLine("Bubble x[{1}]={0}", x[k],k);

}

public static void Main()
{
Random r = new Random();
Thread t1 = new Thread(new ThreadStart(bubble));
t1.Start();

Console.ReadLine();
}
}

شاید این تکه کد کمکت کنه

اتوسا
چهارشنبه 09 آبان 1386, 22:10 عصر
با c# دوست عزیز.من فکر می کردم که فقط تو کنسول میشه این کارو کرد اگه ممکنه بگید نتیجه رو چه طوری به صورت گرافیکی نشون داد .متشکرم

vcldeveloper
جمعه 11 آبان 1386, 04:08 صبح
با c# دوست عزیز.من فکر می کردم که فقط تو کنسول میشه این کارو کرد اگه ممکنه بگید نتیجه رو چه طوری به صورت گرافیکی نشون داد
این سایت برای #C بخش جداگانه ایی دارد.

vbprogrammerx
شنبه 12 آبان 1386, 15:36 عصر
به خیلی روش ها میشه نشون داد
مثلا چند تا progressbar بزاری و در حین اجرای ترد مقدارشونو update کنی
یا چند تا خط روی فرو بزاری و ...
زیاد توی این بحثش نباش فقط همون که بتونی با سه تا نخ این کارو انجام بدی و مشخص بشه کدوم الگوریتم سریع تر است کافیه .
مثلا هر کدوم تمام شد یه message بده که من تموم شدم

اتوسا
دوشنبه 14 آبان 1386, 16:47 عصر
دوست عزیز یه نوار پیشرفت توی فرم گذاشتم با همین تابع bubble اما این پیغامو میده:

Cross-thread operation not valid: Control 'progressBar1' accessed
from a thread other than the thread it was created on.
چطوری بفهمه کی باید پر بشه

اتوسا
سه شنبه 15 آبان 1386, 08:11 صبح
لطفا یه نگاهی به این کد بندازید .من همچین یکم مبتدی ام نمی دونم مشکلش چیه.چه طوری اون الگوریتم هایی رو که دارم تغییر بدم که کار کنه

اتوسا
سه شنبه 15 آبان 1386, 08:19 صبح
using System;
using System.Threading;
publicclassThreadExample
{
publicvoid sortArray()
{
q_sort( 0, x-1 );
}
}
publicstaticvoid q_sort( int left, int right )
{
int pivot, l_hold, r_hold;
l_hold = left;
r_hold = right;
pivot = a[left];
while( left < right )
{
while( (a[right] >= pivot) && (left < right) )
{
right--;
}
if( left != right )
{
a[left] = a[right];
left++;
}
while( (a[left] <= pivot) && (left < right) )
{
left++;
}
if( left != right )
{
a[right] = a[left];
right--;
}
}
a[left] = pivot;
pivot = left;
left = l_hold;
right = r_hold;
if( left < pivot )
{
q_sort( left, pivot-1 );
}
if( right > pivot )
{
q_sort( pivot+1, right );
}
}
////
privatevoid MergeSort(string[] a)
{
string[] a1 = SubArray(a, 0, a.Length / 2 - 1);
string[] a2 = SubArray(a, a.Length / 2, a.Length - 1);
if (a1.Length > 1) MergeSort(a1);
if (a2.Length > 1) MergeSort(a2);
Merge(a1, a2, a);
}
privatevoid Merge(string[] a1, string[] a2, string[] a)
{
int i = 0, j = 0, h = 0;
while (i < a1.Length || j < a2.Length)
{
if (i == a1.Length) a[h++] = a2[j++];
elseif (j == a2.Length) a[h++] = a1[i++];
else
if (a1[i].CompareTo(a2[j]) < 0)
{
a[h++] = a1[i++];
}
elseif (a1[i].CompareTo(a2[j]) > 0)
{
a[h++] = a2[j++];
}
else
{
a[h++] = a1[i++];
a[h++] = a2[j++];
}
}
}
privatestring[] SubArray(string[] array, int start, int end)
{
string[] sub = newstring[end - start + 1];
for (int i = start; i <= end && i < array.Length; i++)
{
sub[i - start] = array[i];
}
return sub;
}
//end merge sort

publicstaticvoid Main()
{
Random r = new Random();
Thread t1 = new Thread(new ThreadStart(qsort));
t1.Start();
Thread t2 = new Thread(new ThreadStart(mergesort));
t2.Start();

}
}

vbprogrammerx
سه شنبه 22 آبان 1386, 21:52 عصر
سلام
باید ببخشید من یه چند روزی سر نزدم
شما نمی توانید مستقیما از ترد به فرم دسترسی پیدا کنید
شما باید مثلا تایمر را راه بیندازید وتایمر این کارو براتون انجام بده
آخر ترد هم تایمر را متوقف کنید.
لازم نیست حتما به طور منظم پر بشه میتونید اونو مرتب پر و خالی کنید
فعلا

vbprogrammerx
سه شنبه 22 آبان 1386, 22:19 عصر
برنامه منو ببینید(البته حرفه ای نیست)