PDA

View Full Version : خطا در استفاده از توابع Clipboard در داخل System.Timer



محمد ذبیحی نژاد
جمعه 21 شهریور 1393, 11:18 صبح
با سلام
در برنامه ام یک تایمر از نوع System.Timerقرار دادم که هنگام اجرای تابع فراخوان تایمر به محض رسیدن به توابع کلیپبورد مثل Clipboard.Clear ویا Clipboard.SetText خطا STAThread می دهد:
متن کد:



namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{

public System.Timers.Timer tTimer = new System.Timers.Timer(1000);
DateTime d;


public Form1()
{
InitializeComponent();
}



public void start()
{
tTimer.Elapsed += new ElapsedEventHandler(RunTimer);
tTimer.Enabled = true;
tTimer.Start();
}


public void RunTimer(Object stateInfo, ElapsedEventArgs e)
{
if (d < DateTime.Now)
{
tTimer.Stop();
Clipboard.Clear();
string reportText = File.ReadAllText(@"c:\test.txt");

Clipboard.SetText(reportText);
}
}


private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "Start Timer")
{
DateTime dt = dateTimePicker1.Value;
if (dt < DateTime.Now)
{
textBox1.Text = "Invalid date";
return;
}


d = dt;
button1.Text = "Stop Timer";
start();
}
else
tTimer.Stop();
}


private void button2_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
textBox1.Text = Clipboard.GetText();
else
textBox1.Text = "No text to Paste";
}


private void Form1_Load(object sender, EventArgs e)
{
Clipboard.Clear();
dateTimePicker1.Value = DateTime.Now;
}
}
}





اینم خود پیام خطا:


123348

لطفا" راهنمایی فرمایید با تشکر

plus
جمعه 21 شهریور 1393, 22:27 عصر
بجای استفاده از System.Timers.Timer از System.Windows.Forms.Timer استفاده کنید.

محمد ذبیحی نژاد
سه شنبه 25 شهریور 1393, 03:58 صبح
بجای استفاده از System.Timers.Timer از System.Windows.Forms.Timer استفاده کنید.
اگر از System.Timer.Form استفاده کنم زمانی که تایمر را اجرا می کنم برنامه را به حالت Not Responding... می بره چون نخ اصلی برنامه را نمی توانم معطل نگه دارم تا زمان مد نظرم فرا برسه.
برای همین از sysytem.timer استفاده کرده که خودش را بروی یک نخ مجزا از نخ اصلی اجرا می کنه

plus
سه شنبه 25 شهریور 1393, 10:45 صبح
خوب مشکل خطایی هم که بهش میخورید اینه که باید در همون Thread مربوط به UI با Clipboard کار کنید.نمیدونم چه نیازی به معطل کردن هست...تایمر مدام رویدادش Raise میشه..زمان رو بررسی کنید و در صورتی که زمان مورد نظرتون هست عمل رو انجام بدین..
هرچند استفاده از Clipboard که یک منبع اشتراکی در کل ویندوز هست در Timer اشتباه هست.