PDA

View Full Version : تابع در Thread درست کار نمی کند!



Eight 01
یک شنبه 13 اسفند 1391, 20:29 عصر
سلام

تابع زیر در صورتی که دکمه 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;
}
}
}
}


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

the king
دوشنبه 14 اسفند 1391, 00:09 صبح
سلام

تابع زیر در صورتی که دکمه 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 { }