用到了一个API:[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, StringBuilder lParam);const int WM_CLICK = 0x00F5;
然后在程序中调用函数:SendMessage(controlHwnd, WM_CLICK, 0, "");相当于点击了另一边的按钮,这时候另一边在处理这个Click事件时陷入了死循环,那边的程序是没法更改的,但这边的程序也会卡住,SendMessage以后的代码不会被执行(可能是在等待SendMessage的返回值??)这时候希望通过某种方法判断一下等待时间,如果等了1分钟还没有响应就执行其他的代码,怎么实现这个“等待一段时间后如果没有响应就执行其他代码的功能”???我的想法是把这个SenMessage函数放到一个线程里,但不知道应该怎么设置这个线程,让它在1分钟后自动停止并通知主线程是因为时间太久而停止???希望各位给点思路,谢谢!!
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, StringBuilder lParam);const int WM_CLICK = 0x00F5;
然后在程序中调用函数:SendMessage(controlHwnd, WM_CLICK, 0, "");相当于点击了另一边的按钮,这时候另一边在处理这个Click事件时陷入了死循环,那边的程序是没法更改的,但这边的程序也会卡住,SendMessage以后的代码不会被执行(可能是在等待SendMessage的返回值??)这时候希望通过某种方法判断一下等待时间,如果等了1分钟还没有响应就执行其他的代码,怎么实现这个“等待一段时间后如果没有响应就执行其他代码的功能”???我的想法是把这个SenMessage函数放到一个线程里,但不知道应该怎么设置这个线程,让它在1分钟后自动停止并通知主线程是因为时间太久而停止???希望各位给点思路,谢谢!!
用线程的话
启动一个timer
SendMessage
timer时间到的话,关掉timer,把线程强行终止不知道行不行。
比如:Thread th=new Thread(new ThreadStart(YourMethod));
th.IsBackground=true;
th.Start();
public void YourMethod()
{
//你的代码。
}
如果,你有还要在辅线程里面操作主界面,如果直接操作会报“在不是创建控件的”错误。那么你可以用以下2个方法解决。第一:
Control.CheckForIllegalCrossThreadCalls = false;
线程开始的时候加这么一句,OK,看不到错误了~
啥都能用了~第二:
用委托,在05里,每个控件都有个InvokeRequired的属性~
判断一下是不是true,是的话进行Invoke操作的,完事了~ //建立个委托
private delegate string returnStrDelegate();//搞个最简单滴取值滴方法~
private string returnSchool()
{
return CB_School.SelectedValue.ToString();
}//判断一下是不是该用Invoke滴~,不是就直接返回~
private string returnCB(returnStrDelegate myDelegate)
{
if (this.InvokeRequired)
{
return (string)this.Invoke(myDelegate);
}
else
{
return myDelegate();
}
}//别的线程里的调用哇~
string _school = returnCB(returnSchool);
http://it.china-b.com/cxsj/cs/20090821/153734_1.html
我们日常工做中常会遇到这种场景:数据库、远程webservice、串口设备等等连接失败,或其他需要长时间等待才能前往错误消息的情况。这时我们需要设定一个超时时间如果出现问题能够及时反馈给用户。虽然我们给数据库或webservice把超时设定很短,但这样做不灵活因为有些操做本身就是很耗时的。因而我们应该利用多线程来处理这个问题。 其实这个问题很好处理,会超时的操做用异步执行(异步委托或者线程池),用户主线程进行等待通知(ManualResetEvent)。如果用户在超时时间能都没等到就会激发超时事件通知用户。看代码吧一目了然: public class TimeoutChecker { long _timeout; //超时时间 Action _proc; //会超时的代码 Action _procHandle; //处理超时 Action _timeoutHandle; //超时后处理事件 ManualResetEvent _event = new ManualResetEvent(false); public TimeoutChecker(Action proc, Action timeoutHandle) { this._proc = proc; this._timeoutHandle = timeoutHandle; this._procHandle = delegate { //计算代码执行的时间 Stopwatch sw = new Stopwatch(); sw.Start(); if (this._proc != null) this._proc(); sw.Stop(); //如果执行时间小于超时时间则通知用户线程 if (sw.ElapsedMilliseconds < this._timeout && this._event != null) { this._event.Set(); } }; } public bool Wait(long timeout) { this._timeout = timeout; //异步执行 this._procHandle.BeginInvoke(null, null); //如果在规定时间内没等到通知则为false bool flag = this._event.WaitOne((int)timeout, false); if (!flag) { //触发超时时间 if (this._timeoutHandle != null) this._timeoutHandle(); } this.Dispose(); return flag; } private void Dispose() { if(this._event != null) this._event.Close(); this._event = null; this._proc = null; this._procHandle = null; this._timeoutHandle = null; } } 代码很简单,下面是调用例子 TimeoutChecker we = new TimeoutChecker(delegate { using (SqlConnection conn = new SqlConnection()) { conn.ConnectionString = "server=.;database=test;uid=sa;pwd=s"; conn.Open(); }}, delegate { Console.WriteLine("数据库不具有"); }); if (we.Wait(200)) Console.WriteLine("链接成功"); 引用一下命名空间:sing System.Threading;
using System.Data.SqlClient;
using System.Diagnostics;
public class SendMessageTest
{
public void Run()
{
Thread td = new Thread(new ParameterizedThreadStart(Send));
td.Start();
System.Threading.Thread.Sleep(new TimeSpan(0, 1, 0));
} public void Send(object obj)
{ }
}
{
sendmessage(,,)
}
我写的是于主线程的。
sleep后可以直接abort线程释放资源。