这样的程序怎样关(线程)

kikyang
等级:小飞侠
财产:11670
经验:11065
魅力:1889
注册:2002-10-22
登录:2003-4-24
文章:594

[问题]这样的程序怎样关闭!
这样的程序怎样正常退出,退出程序还有什么办法!
我已经把对于阻碍程序退出不重要的东西删掉了,便于阅读.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace UDPTESTserver
{
    /// <summary>
    /// Form1 的摘要说明。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.RichTextBox richTextBox1;
        private System.ComponentModel.IContainer components;
        private bool mdone = true;//循环参数
        private System.Threading.Thread thread;
        private UdpClient receivingUdpClient = new UdpClient(888);//设定监听端口为888
        private byte[] receiveBytes;//接收数据缓存
        private IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 888);//暂设监听本机888端口

        public Form1()
        {
            // 
            // Windows 窗体设计器支持所必需的 
            // 
            InitializeComponent();
            thread = new Thread(new ThreadStart(Listener));//监听线程 
                                                           // 
                                                           // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 
                                                           // 
        }
        /// <summary> 
        /// 清理所有正在使用的资源。 
        /// </summary> 
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code 
        /// <summary> 
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改 
        /// 此方法的内容。 
        /// </summary> 
        private void InitializeComponent()
        {

        }
        #endregion

        /// <summary> 
        /// 应用程序的主入口点。 
        /// </summary> 
        [MTAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }


        private void Listener()//监听线程 
        {
            while (mdone)
            {
                this.richTextBox1.AppendText(".");//辅助语句,这句用来表现线程在不断循环,但是只动作过一次以后在下句没有接到数据的情况下都不会再次动作. 
                receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint); //接收字符数组,****但是现在线程会停在这里等待接收数据无法进入到下次循环 
            }
        }
        //弹出报警窗口 

        private void button1_Click(object sender, System.EventArgs e)
        {
            if ((thread.ThreadState & ThreadState.Unstarted) != 0)
            {
                thread.Start();//开始线程
            }
        }
        private void button2_Click(object sender, System.EventArgs e)
        {
            this.mdone = false;//由于 receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);在等待,所以线程的循环无法接收到这句,所以无法跳出循环,线程无法结束!!! 
                               //thread.Abort();//即使加上这句,线程也结束不了 
            Application.Exit();//由于线程结束不了,所以整个程序也就无法正常关闭,只是表面的窗口关了,内存中整个进程仍然生存. 
        }
    }
}
█ ◤ ▼ █ ◤ ◥ █ ▲  ◥  ◤◥
█ ◣ █ █ ◣    █ █  ◣  ◣◆  

发贴时间: 2002-12-18 9:48:37



Michael_Jackson
头衔:我哪里有呀!:)
等级:小飞侠
财产:12660
经验:10258
魅力:3135
注册:2002-10-17
登录:2003-4-16
文章:462

在thread.Abort(); 之前先thread.Join一下! 试试

有些问题大家可以先看看MSDN自已试着解决,实在不行再到坛子里来问,这样有助自己的提高! :)

来来,我是一颗荔枝,枝枝枝枝枝枝枝枝枝枝
来来,我是一个榴梿,梿梿梿梿梿梿梿梿梿梿

发贴时间: 2002-12-18 10:09:47



zhwell
等级:论坛游侠
财产:1840
经验:1490
魅力:254
注册:2002-12-17
登录:2003-2-14
文章:81

我做的线程怎么没有碰到你的问题?
线程不停肯定是退不出的!
我在 dispose里面加上 thread.Abort(); 就没有问题了(try 一下)!

发贴时间: 2002-12-18 10:14:40



kikyang

那样不成,我试过的.
最后终于解决了,真是高兴啊.花了我昨天一晚上的功夫!
添加了这个东西,自己给自己发个包.

在声明的地方加上

private UdpClient sendudpClient = new UdpClient(889);//设定发送端口为889
private byte[] sendByte;//发送数据缓存

this.mdone=false;之后加上:

RemoteIpEndPoint.Address=IPAddress.Parse("127.0.0.1");
RemoteIpEndPoint.Port=889;
sendByte=System.Text.Encoding.Default.GetBytes("q");
sendudpClient.Send(sendByte,sendByte.Length,RemoteIpEndPoint);//发送确认接收数据包

程序收到自己发的包,
然后把mdone更新为false线程正常结束.
程序就可以退出了.
真是受不了,自己开的东西自己关不了.呵呵,总算关了.
另:程序里两个端口号都是不符合规定的,应该大于1024,我这里是举例子,乱写的.

发贴时间: 2002-12-18 10:22:04



kikyang

谢谢你.

以下内容为引用:

我做的线程怎么没有碰到你的问题?
线程不停肯定是退不出的!
我在 dispose里面加上 thread.Abort(); 就没有问题了(try 一下)!

这个方法我也试过,也没有退出.
不过谢谢你.

发贴时间: 2002-12-18 10:23:07



Contributors: FHL