نمایش نتایج 1 تا 2 از 2

نام تاپیک: تابع در Thread درست کار نمی کند!

  1. #1

    تابع در Thread درست کار نمی کند!

    سلام

    تابع زیر در صورتی که دکمه Shift فشرده شود ، مقدار داخل کلیپ بورد را به فایل متنی کنار برنامه اضافه می کند.

    تابع ایرادی نداره و بلافاصله بعد از فشردن کلید شیفت ، دستورات ذخیره سازی اجرا میشه . مشکل اینجاست زمانی که تابع را در یک Threadجداگانه اجرا می کنم کار نمی کنه و مقدار کلیپ بورد ذخیره نمیشه.


    [DllImport("User32.dll")]
    private static extern short GetAsyncKeyState(System.Windows.Forms.Keys key);

    private void Log()
    {
    string c = "";
    for (; ; )
    {
    short state = GetAsyncKeyState(Keys.ShiftKey);
    if (state == -32767)
    {
    string c2 = Clipboard.GetText();
    if (c2 != "" && c2 != c)
    {

    File.AppendAllText("words.txt", c2 + "\r\n\r\n-------\r\n\r\n");
    c = c2;
    }
    }
    }
    }


    پروژه را هم قرار دادم.
    ممنون میشم راهنمای کنید.
    فایل های ضمیمه فایل های ضمیمه

  2. #2

    نقل قول: تابع در Thread درست کار نمی کند!

    نقل قول نوشته شده توسط Eight 01 مشاهده تاپیک
    سلام

    تابع زیر در صورتی که دکمه Shift فشرده شود ، مقدار داخل کلیپ بورد را به فایل متنی کنار برنامه اضافه می کند.

    تابع ایرادی نداره و بلافاصله بعد از فشردن کلید شیفت ، دستورات ذخیره سازی اجرا میشه . مشکل اینجاست زمانی که تابع را در یک Threadجداگانه اجرا می کنم کار نمی کنه و مقدار کلیپ بورد ذخیره نمیشه.

    پروژه را هم قرار دادم.
    ممنون میشم راهنمای کنید.
    استفاده از Clipboard نیازمند Thread های STA یا Single Threaded Apartment است. در Thread اصلی پروژه تون این قابلیت
    بصورت پیشفرض فعاله ، برای همینه که در Thread اصلی کد تون مشکلی نداره. فایل Program.cs پروژه تان را ببینید :

    [STAThread]
    static void Main()
    {


    اما در Thread ای که خودتان می سازید، باید با کد نویسی STA رو انتخاب کنید، یعنی با SetApartmentState انتخاب بشه :

    private void button1_Click(object sender, EventArgs e)
    {
    t = new Thread(new ThreadStart(Log));
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
    button1.Enabled = false;
    }


    در ضمن هیچوقت بدون چک کردن ContainsText با Clipboard و یا بدون try catch با فایل ها کاری نداشته باشید،
    مخصوصا در یک Thread مستقل. رعایت کردن این مساله روی پایداری برنامه تون تاثیر زیادی داره.

    try
    {
    if (Clipboard.ContainsText())
    {
    string c2 = Clipboard.GetText();
    if (c2 != "" && c2 != c)
    {

    File.AppendAllText("words.txt", c2 + "\r\n\r\n-------\r\n\r\n");
    c = c2;
    }
    }
    }
    catch { }

تاپیک های مشابه

  1. دستور Locate درست کار نمی کند!!
    نوشته شده توسط Krubnik در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 16
    آخرین پست: چهارشنبه 30 شهریور 1390, 14:08 عصر
  2. در موقع ویرایش فرم سی شارپ ادیتور سی شارپ درست کار نمی کند
    نوشته شده توسط سیدمحمدرضا در بخش C#‎‎
    پاسخ: 1
    آخرین پست: دوشنبه 02 آبان 1384, 12:45 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •