اطلاعیه

Collapse
No announcement yet.

مشکل در استفاده از لیست و کلاس با C#

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در استفاده از لیست و کلاس با C#

    سلام
    یه نظر رو این میتونید بدید؟
    http://www.4shared.com/file/TWNIezvc/Q_online.html
    توش یه کلاسه:
    کد:
    namespace Q
    {
      class test: Form1 
      {
        public string exp1()
        {
          return STR[index];
        }
      }
    }
    با این برنامه:
    کد:
    namespace Q
    {
      public partial class Form1 : Form
      {
        public List<string> STR;
        public UInt16 index;
        private test a;
        public Form1()
        {
          InitializeComponent();
          STR = new List<string>();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          string t ;
          t = textBox1.Text;
          STR.Add(t);
          MessageBox.Show(STR[index]);
          //index++;
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
          MessageBox.Show(a.exp1());
        }
      }
    }
    وقتی Button2 رو میزنم خطا میده.
    Object reference not set to an instance of an object.
    ;()((void (*)(void))0x0000))

    #2
    پاسخ : مشکل در استفاده از لیست و کلاس با C#

    باید هم خطا بده. a رو که new نکردین. مقدار null داره.

    دیدگاه


      #3
      پاسخ : مشکل در استفاده از لیست و کلاس با C#

      ممنون از توجهتون.
      من کجا a رو new کنم؟
      اگه اینجا:
      کد:
          public Form1()
          {
            InitializeComponent();
            STR = new List<string>();
            a = new test();      
          }
      new کنم هیچ اروری نمیده ولی اصلا برنامه بالا نمیاد!!!
      اگه هم تو فرو لودnew کنم، سراجرای تابع توی کلاسم میگه:
      Index was out of range. Must be non-negative and less than the size of the collection.
      Parameter name: index
      یه دکمه هم جدا برای new کردن گذاشتم که سر اجرای برنامه اول اونو بزنیم و a ،new بشه، بازم سر همون تابع توی کلاس همون پیام بالارو میده.
      و لیست مارو خالی میکنه ، مشکل من همینه
      ;()((void (*)(void))0x0000))

      دیدگاه


        #4
        پاسخ : مشکل در استفاده از لیست و کلاس با C#

        ببینم میشه بگی اصلا میخوایی چکار کنی؟ سورس رو توضیح نده. فقط مشکل رو بگو.

        دیدگاه


          #5
          پاسخ : مشکل در استفاده از لیست و کلاس با C#

          لیستم رو توی فرم 1 تعریف کردم و پابلیک هم هست.
          یه کلاس جدا هم ساختم و گفتم که از فرم 1 ارث ببره.
          اینجوری باید بتونم از توی کلاسم به متغیر لیستم دسترسی داشته باشم که دسترسی دارم ولی میگه لیست خالیه! با این که پر هم هست.
          چه کار کنم تا لیستم خالی نشه؟
          ;()((void (*)(void))0x0000))

          دیدگاه


            #6
            پاسخ : مشکل در استفاده از لیست و کلاس با C#

            اولا لیست تون رو باید readonly تعریف کنین که اشتباها از بیرون مقدار خود لیست عوض نشه. و یا بصورت زیر تعریف کنین:


            public readonly List<string> STR;


            یا

            public List<string> STR {get; private set;}


            اما من نمیفهمم چرا وقتی خود Form1 رو دارین کلاسی به اسم test ازش ارث میبره؟ خوب متد exp رو داخل Form1 تعریف کنین.

            تازه غیر از این؛ a باید در constructor مربوط به Form1 ابتدا new بشه.
            چون a.STR با Form1.STR یکی هست. منتهی مربوط به دو شیء متفاوت.

            دیدگاه


              #7
              پاسخ : مشکل در استفاده از لیست و کلاس با C#

              راستش اصل برنامه من خیلی پیچیده تر از اینه ولی مشکلم اونجا همین مشکل اینجاست.
              اونجا من یه ترد دارم که تو این ترد در صورت تغییر یه چیزی یه ترد دیگه باید ایجاد بشه.
              و از اونجا که تعداد ترد هایی که ساخته میشه معلوم نیست و ترد هم یه تابع رو قبول میکنه و تابع هم نمیشه به صورت آرایه تعریف کرد، یه کلاس ساختم و تابع مورد نظر رو تو کلاس نوشتم و کلاسی که ساختم رو آرایه کردم. و من نیاز دارم تا با محتویات لیستم هم تو ترد هایی که تعدادشون معلوم نیست کار کنم هم تو همین ترد که ترد های دیگه رو میسازه و هم تو Form1 که ترد اولم تو Form1 هست و هیچ مشکلی باهاش ندارم ولی تو کلاسا این مشکل هست.
              public readonly List<string> STR;
              هم اعمال کردم ولی تاثیر نداشت.
              و متوجه نشدم a دقیقا کجا باید new بشه!، در حال حاضر تو Form load نیو کردمش.
              ;()((void (*)(void))0x0000))

              دیدگاه


                #8
                پاسخ : مشکل در استفاده از لیست و کلاس با C#

                ببینم! نکنه میخوایین چیزی مثل سرویس بسازین؟ چرا از مکانیسم message pumping خود فرم استفاده نمیکنین؟ یا از ThreadPool؟ اینجوری کارتون بهتر راه میفته! راستی نمیتونین مشکل رو دقیقا شرح بدین؟ اینجوری فکر نکنم کارتون راه بیفته.
                اگر فکر میکنین اینجا نمیشه راجع بهش صحبت کرد بهم pm بدین.

                دیدگاه


                  #9
                  پاسخ : مشکل در استفاده از لیست و کلاس با C#

                  نه چیز خصوصی هم نیست.
                  راستش یه چیزی تو مایه های سرور مسنجره.
                  چندین کلاینت باید بتونن با این سرور ارتباط برقرار کنند از طریق سوکت، برای این کار یه متغیر از نوع TCPlistener تعریف کردم و یه لیست از نوع Socket و یه لیست دیگه از نوع NetworkStream و یه لیست از نوع BinaryReader و یکی دیگه از نوع BinaryWriter و یکی هم برا ترد ها از نوع Thread که بعد از Listener.Start(); ترد اول شروع به کار میکنه و به ترتیب هر ارتباط رو از طرف کلاینت ها تو یه خونه از لیست هایی که گفتم قرار میده که این وسط به ازای هر ارتباط یه ترد دیگه هم ساخته میشه تا BinaryReader از طرف هر کلاینت مدام چک بشه تا درخواستی که از طرف کلاینت میاد رو بتونیم پردازش کنیم و در آخر هم به متغییر اندیس لیستامون یکی اضافه می کنیم تا دوباره که ترد اجرا شد یه خونه دیگه از لیست هارو مقدار دهی کنه.
                  همونطور که قبلا گفتم چون تعداد ترد هایی که وسط ترد اصلی ساخته میشن معلوم نیست یه لیست از ترد درست کردم و برای تابع درون ترد هم یه کلاس و لیستی از همون کلاس که به هر ترد ساخته شده باید میدادمش.
                  برای BinaryReader داخل کلاس هم گفتم کلاس رو بگم که از فرم اصلی ارث ببره تا بتونم به اصل لیست BinaryReader دسترسی داشته باشم و فقط اندیس رو بهش بفرستم که اینجا برای بار اول به این مشکل برخوردم که با یه حرکت ساده حل شد، اما همین کارو میخواستم برای BinaryWriter انجام بدم که دیگه اون حرکتی که BinaryReader رو حل کردم به کارم نمیومد، مشکل BinaryReader رو با یه حرکت دستی حل کردم چون تو هر ترد فقط باید یک BinaryReader بررسی میشد اما تو همون ترد باید بشه به تمام BinaryWriter ها دسترسی داشت.
                  که سر این به این مشکل رسیدم.
                  حالا راه حل های دیگه ای اگه میشناسین که بهتر از این باشه ممنون میشم.
                  ;()((void (*)(void))0x0000))

                  دیدگاه


                    #10
                    پاسخ : مشکل در استفاده از لیست و کلاس با C#

                    با اجازه تون (با عرض معذرت) سوراخ دعا رو گم کردین! :mrgreen:
                    معمولا یک سرور رو به این صورت پیاده میکنن:
                    1- یک ترد برای اخذ درخواستهای کانال ارتباطی (اینجا TCP) ساخته میشه. این ترد هیچ کاری نداره جز اینکه درخواستها رو شناسایی کنه و اونها رو بفرم یک سوکت یا NetworkStream در یک queue قرار بده.
                    2- یک تعداد ترد داریم (تعداد ثابت؛ مثلا 10 تا) که بهشون work-thread میگیم. اینا منتظر میشن تا وقتی یکی به queue اضافه بشه یکی یکی درخواستها رو بردارن و پردازش کنن و نتیجه رو به کلاینت ها ارسال کنن.
                    اینجوری با توجه به اینکه TCP server socket دارای backlog هست و میتونه تعداد زیادی درخواست رو در حالت pending نگه داره مشکلی در رابطه با درخواست ها پیش نمیاد.

                    البته برای اینکه پردازش درخواست ها مشکل نباشه و سیستم حداکثر سرعت رو پیدا کنه میتونین بجای ساختن ترد های کاری از ThreadPool به همراه AsyncProgramming استفاده کنین. اینجوری فقط یک thread دارین ولی به تمامی درخواست ها هم سرویس میدین.

                    این منطق کلی سرور ها هست. اگر در پیاده سازیش مشکلی دارین بگین تا نمونه کد بذارم.

                    دیدگاه


                      #11
                      پاسخ : مشکل در استفاده از لیست و کلاس با C#

                      ممنون از راهنمایتون>
                      اگه لطف کنین یه نمونه کد هم بزارین بیشتر روش کار می کنم.
                      حالا یه سوال: اگه ما از BinaryReader استفاده کنیم، هر وقت برنامه به BinaryReader میرسه اینقدر صبر میکنه تا یه ورودی بگیره، حالا اگه ما چندین BinaryReader داشته باشیم اونارو نمیتونیم پشت سر هم تو یک ترد بچینیم چون اگه BinaryReader اول ورودی نگیره BinaryReader دوم اگه هم ورودی داشته باشه کاری نمیتونیم در همون لحظه براش انجام بدیم. برای همین من هر BinaryReader رو تو یک ترد انداختم، حالا روش شما رو هنوز دقیق متوجه نشدم که اگه یه نمونه کد ساده بیاد میرم سراغش.
                      بازم ممنون.
                      ;()((void (*)(void))0x0000))

                      دیدگاه


                        #12
                        پاسخ : مشکل در استفاده از لیست و کلاس با C#

                        این پروژه رو ببینید.

                        توضیح: من تا آخر هفته ممکنه به اینترنت دسترسی نداشته باشم. این ایده کلی رو نشون میده. امیدوارم کار کنه.
                        فایل های پیوست شده

                        دیدگاه

                        لطفا صبر کنید...
                        X