用到了一个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分钟后自动停止并通知主线程是因为时间太久而停止???希望各位给点思路,谢谢!!

解决方案 »

  1.   

    可以考虑用SendMessageTimeout或者PostMessage
    用线程的话
    启动一个timer
    SendMessage
    timer时间到的话,关掉timer,把线程强行终止不知道行不行。
      

  2.   

    使用API SendMessageTimeout这个可以设置超时时间的http://baike.baidu.com/view/1080192.htm?fr=ala0_1http://m.cnblogs.com/31308/1684948.html?full=1
      

  3.   

    给你个思路:开辅线程去处理你那个需要很长时间才返回的操作。
    比如: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); 
      

  4.   

    确定一个应用程序是否没有响应
    http://it.china-b.com/cxsj/cs/20090821/153734_1.html
      

  5.   

    应用多线程:处理等待超时问题[转贴]
    我们日常工做中常会遇到这种场景:数据库、远程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;
     
      

  6.   


        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)
            {        }
        }
      

  7.   

        public void Send(object obj)
            {
    sendmessage(,,)
            }
      

  8.   

    六楼是多线程间通信。
    我写的是于主线程的。
    sleep后可以直接abort线程释放资源。