假设程序主线程是s1,在主线程上派生的线程是s2。现在有这么一个问题:当s2正在执行时,s1接到外部消息说本程序需要结束,那么s1如何通知s2这个消息? 然后s1要等待s2把自己的善后做完以后才能kill掉s2,然后结束整个程序。当然了,s2处理完自己的善后还要通知s1:你可以kill我了。
解决方案 »
- 求助:如何获取网页源代码中元素的值
- qq2009 sp6自动登录器是用什么方式实现自动登录?原来的方法都不好用了!
- 跨线程访问控件竟然不出错
- winform checkbox 怎样才能disable?就是不能选择不是readonly那种,选都不能选有没有
- 如何让DataGridVIew的选中方式同 dataGrid一样
- DataTable中数据批量导入到Access数据库中
- 求b/s版的权限管理思路和框架!!!
- 请问 CS Form 能否调用JAVASCRIPT ?
- 再一次的打包问题,急
- asp的session内容能不能被同一目录下的aspx文件读取??
- 大侠们帮我看看
- 在C#中如何屏蔽webbrowser和mshtml的右键菜单,谢谢
private void DelThread()
{
s2.join(); //等待s2结束后才往下执行。
// do your other code;
this.dispose();
}
private void DelThread()
{
s2.join(); //等待s2结束后才往下执行。
// do your other code;
this.dispose();
}
这里的"等待s2结束后才往下执行。",什么叫做s2结束?他自己杀死自己吗?
s2.start();private void ttt ()
{
\\fo your work;
}线程开始于s2.start;
终止于ttt()完成。如果ttt中有循环,例如:
private void ttt()
{
while ( true )
{
//侦测某一个端口;
}
}这样的话,s2才会一直执行下去,除非强行结束。
也就是说,在外部(例如s1中)执行:s2.abort();
在s1的函数中使用 s2.Abort();
然后使用 s1.Join()等待系统通知s2已经结束s2.Abort会引发一个异常,一般可以在 catch 中捕获该特定类型的异常,进行善后
private void button1_Click(object sender, System.EventArgs e)
{
//启动监听线程
Iprocessor = new Thread(new ThreadStart(Listening));
Iprocessor.Start();
}
//侦听
private void Listening()
{
listener = new TcpListener(InPort); try
{
listener.Start();
}
catch(Exception ex)
{
WriteTextLog(strLogFile,"无法打开端口" + ex.Message);
} while(Iprocessor.IsAlive)
{
try
{
sAccepted = listener.AcceptSocket(); //接受挂起的连接请求,返回一个SOCKET对象 //启动接收线程
Iclientservice = new Thread(new ThreadStart(IServiceClient)); Iclientservice.Start();
}
catch(Exception ex)
{
if(Iclientservice.IsAlive)
{
Iclientservice.Abort();
}
break;
}
}//end while
}//接收和处理以及发送报文
private void IServiceClient()
{
while(sAccepted.Connected)//只要客户端没有断开,就一直处理来自她的消息----实现所谓的“长连接”
{
try
{
if(sAccepted.Available != 0)//有数据可接收
{
//业务处理
}
else
{
Thread.Sleep(30000);//阻塞当前线程30秒,以避免这个死循环一直在走而占用CPU
}
}
catch(Exception ex)
{} }//end while //既然客户端已经断开,那么就关闭这个socket
sAccepted.Shutdown(SocketShutdown.Both);
sAccepted.Close();
}
{}上面的方法适合一次取消所有线程如果只取消某个, 则需要对线程编号 ,然后分别private bool [] Cancel_IServiceClient,
定义一个标识数组.更科学的方法是继承一个线程类,然后直接对该类的实例操作
请大家关心我的问题。
我一直在VS2003看不到错误(或异常)对话框。当我的程序经过(throw new exception)时,只是退出,没有
错误(或异常)对话框弹出或者在输出终端输出错误细节,NullReferenceException 和数组边界溢出一样,没有错误(或异常)对话框弹出或者在输出终端输出错误细节。这搞得我不知道哪儿出错,可费劲了。最后我不得不用 Debug.assert去代替所有的Exception。
有没有那位网友遇到同样的现象?谢谢了。
bool 类型的全局变量,子线程的循环条件先判断该全局变量
是否为true,当主线程要结束时,把该变量设为false。
当然该共享变量需要用互斥体保护起来(JAVA 里面似乎不用)。
要是这样的话,就不用这么麻烦了,用bool判断一下就行了。
1,不想用sleep(30000)--我原来用这个是怕while()循环占用cpu太厉害;他的意思是说把sleep(30000)修改为等待一个消息----一旦这个连接上有下一条消息来了,就马上去处理,否则一直在这里等。2,不同意用置位全局变量的方式通知子线程。
http://blog.csdn.net/yeerh/archive/2006/06/22/821797.aspx