首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#用新线程创建的窗口老是为响应

2013-12-13 
C#用新线程创建的窗口总是为响应刚刚学习C#大概三个星期,大作业要求利用socket写一个通信的软件。现在我服

C#用新线程创建的窗口总是为响应
刚刚学习C#大概三个星期,大作业要求利用socket写一个通信的软件。现在我服务器端有一个发布系统消息的功能,然后客户端的线程监听到了之后就开启另外一个线程新建一个通知窗口(类似QQ那样)


客户端的监听到系统消息时候响应代码:

else if (acceptFromServer[0] == "System")
                    {
                        message_system = acceptFromServer[1];
                        //清除缓存区的内容
                        for (int i = 0; i < acceptFromServer.Length - 1; i++)
                        {
                            acceptFromServer[i] = "";
                        }
                        //开启新线程创建窗口
                        Thread new_window = new Thread(new ThreadStart(System_window));
                        new_window.Start();
                        new_window.IsBackground = true;
                    }


这个是新建窗口的函数
public void System_window()
        {
            Message_right_down b = new Message_right_down(message_system);
            b.Show();
            while (b.closeFlag)
            {
                Thread.Sleep(100);
            }
         }

新窗口的变量什么的在这里:
public partial class Message_right_down : Form
    {

        [DllImport("user32")]
        //[DllImport("user32.dll")]
        private static extern bool AnimateWindow(IntPtr hwnd, int dateTime, int dwFlags);
        //hwnd窗口句柄.dateTime:动画时长.dwFlags:动画类型组合 
        //下面是dwFlags的各种动画标志:
        int AW_ACTIVE = 0x20000; //激活窗口,在使用了AW_HIDE标志后不要使用这个标志   
        int AW_HIDE = 0x10000;//隐藏窗口   
        int AW_BLEND = 0x80000;// 使用淡入淡出效果   
        int AW_SLIDE = 0x40000;//使用滑动类型动画效果,默认为滚动动画类型,当使用AW_CENTER标志时,这个标志就被忽略   
        int AW_CENTER = 0x0010;//若使用了AW_HIDE标志,则使窗口向内重叠;否则向外扩展   
        int AW_HOR_POSITIVE = 0x0001;//自左向右显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志   
        int AW_HOR_NEGATIVE = 0x0002;//自右向左显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志   
        int AW_VER_POSITIVE = 0x0004;//自顶向下显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志   
        int AW_VER_NEGATIVE = 0x0008;//自下向上显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志 
        
        private int currentX;//横坐标      
        private int currentY;//纵坐标      
        private int screenHeight;//屏幕高度      
        private int screenWidth;//屏幕宽度
        public  bool closeFlag = false;
        
        public Message_right_down(string message)
        {
            InitializeComponent();


            //label1.Text = message;  
        }
        public Message_right_down()
        {
            InitializeComponent();
        }

        private void Message_right_down_Load(object sender, EventArgs e)
        {
            Rectangle rect = Screen.PrimaryScreen.WorkingArea;
            screenHeight = rect.Height;
            screenWidth = rect.Width;
            currentX = screenWidth - this.Width;
            currentY = screenHeight - this.Height;
            this.Location = new System.Drawing.Point(currentX, currentY);
            AnimateWindow(this.Handle, 1000, AW_SLIDE | AW_VER_NEGATIVE); 
        }
        private void Message_right_down_FormClosing(object sender, FormClosingEventArgs e)
        {
            closeFlag = true;     
        }

         
    }


我网上查了好多资料,有的说线程阻塞,有的说用委托,invoke这些我都不太懂。希望大神可以详细解答C#用新线程创建的窗口老是为响应
有其他代码要看的回复下 我会马上贴出来的
         
[解决办法]
内容我没看 ,  这是 winsdk c++的互操作了. 有c#版本的 notifycation ,搜搜, 跟你要的差不多.有示例.
[解决办法]
未响应是因为窗体加载中用了AnimateWindow函数,加载完成后,就能响应了。

b.Show();
while (b.closeFlag)
{
Thread.Sleep(100);
}

这几句可用b.ShowDialog代替。

热点排行