نوشته شده توسط
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 { }