在UI线程以外的线程操作UI元素可能导致不可预料的错误,因此要使用this.invoke()或this.BeginInvoke()
Invoke()为同步,Begininvoke()为异步。
如:
this.Invoke(new EventHandler(ShowText), “Show Test!”);
private void ShowText(object obj, EventArgs e)
{
string str = obj as string;
tb_Test.AppendText(str);
}
或者使用匿名委托
this.Invoke(new ThreadStart(delegate
{
TextBox text = ctl_pim_debug_tbLog;
text.AppendText(sLog + "\r\n");
}));
实现每秒更新一次时间,空闲等待超时退出
System.Threading.Timer m_time_now;
m_time_now = new System.Threading.Timer(evt_timer_tick, null, 0, 1000);
private void evt_timer_tick(object sender)
{//时间事件
this.BeginInvoke(new EventHandler(delegate
{
this.toolStripStatusLabel4.Text = DateTime.Now.ToShortTimeString();
}));
long spaceTimeNum = MyFunction.GetLastInputTime();
if (spaceTimeNum >= 900000)
{
m_time_now.Dispose();
MessageBox.Show("系统空闲时间已到,即将关闭", "Tips", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Environment.Exit(0);
}
}
MyFunction.GetLastInputTime()方法
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
// 设置结构体块容量
[MarshalAs(UnmanagedType.U4)]
public int cbSize;
// 捕获的时间
[MarshalAs(UnmanagedType.U4)]
public uint dwTime;
}
[DllImport("user32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
/// <summary>
/// 获取系统空闲时间
/// </summary>
/// <returns></returns>
public static long GetLastInputTime()
{
LASTINPUTINFO vLastInputInfo = new LASTINPUTINFO();
vLastInputInfo.cbSize = Marshal.SizeOf(vLastInputInfo);
if (!GetLastInputInfo(ref vLastInputInfo))
return 0;
else
return Environment.TickCount - (long)vLastInputInfo.dwTime;
}