线程问题?来者有分。

hnwlk 2003-08-01 10:27:55
win2k professional下的程序中使用线程,创建后线程就附running_num=0,
并Star(),star的线程内容大概如下;
private void my_thread()
{
if(running_num==0)
{
end_work=true;
no_work=true;
running_num++;
this.my_thread.Suspend();
}
while(true)
{
end_work=false;
no_work=false;
//处理函数......
end_work=true;
no_work=true;
this.my_thread.Suspend();
}
}
在timer1控件中根据end_work和no_work的值来进行Resume()和Suspend(),如下:
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(end_work==true && no_work==true)
{
this.my_thread.Suspend();
this.statusBarPanel2.Text="工作状态:空闲";
}
if(e.SignalTime.Second%15==0 && end_work==true && no_work==true)
{
no_work=false;
end_work=false;
this.statusBarPanel2.Text="正在处理....";
this.my_thread.Resume();
if(running_num<10) running_num++;
else running_num=1;
}
}
但关闭程序后,在win2k的windows任务管理器中还有此程序在运行,没有完全退出,
如不使用线程就可完全退出。若是使用线程应如何完全退出?因为这个程序只能运行
一个实例,在程序的加载时就判别有无程序在运行。
...全文
78 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnwlk 2003-08-02
  • 打赏
  • 举报
回复
to pipibug()
把 if((int)my_thread.ThreadState == 96) { my_thread.Resume(); my_thread.Abort();}
else{ my_thread.Abort(); }
加到:
Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)

中,仍有错误提示如下:

应用程序发生位处理的异常,如果单击"继续",..如果单击"退出"..
线程被挂起;正在尝试中止。

详细信息:
************** 异常文本 **************
System.Threading.ThreadStateException: 线程被挂起;正在尝试中止。
at System.Threading.Thread.AbortInternal()
at System.Threading.Thread.Abort()
at zdfb.Form1.Form1_Closing(Object sender, CancelEventArgs e) in d:\wxg\c#\zdfb\zdfb\form1.cs:line 1501
at System.Windows.Forms.Form.OnClosing(CancelEventArgs e)
at System.Windows.Forms.Form.WmClose(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
......
pipibug 2003-08-02
  • 打赏
  • 举报
回复
被挂起的线程要先被恢复才可以退出。

再退出前判断:
if((int)Thread.ThreadState == 96) { Thread.Resume(); Thread.Abort();}
else{ Thread.Abort(); }

应该可以解决“未处理的“System.Threading.ThreadStateException”类型的异常出现在
mscorlib.dll 中。其他信息: 线程被挂起;正在尝试中止。”的问题。

注释: 本来应该使用if(Thread.ThreadState == Threading.ThreadState.Suspended)来判断的。 Threading.ThreadState.是一个枚举, Suspended的值是64,可是我在vs2003中调试发现当线程被挂起时Thread.ThreadState的实际值是96。 此处乃vs2003的bug. 我发现的噢!~
dyesucker 2003-08-02
  • 打赏
  • 举报
回复
用abort和join方法,因该可以结束的
rocksnow 2003-08-02
  • 打赏
  • 举报
回复
满好的
pipibug 2003-08-02
  • 打赏
  • 举报
回复
to: jennyq_zq(qq) 你的话很受用, 不过你怎么找到96代表什么的? 我的msdn里面的ThreadState里面都没有发现这个值呀。 我想看看还有什么其它状态。

hnwlk 2003-08-02
  • 打赏
  • 举报
回复
最终使用:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if(my_thread.ThreadState.ToString() =="Suspended")
{
my_thread.Resume();
my_thread.Abort();
my_thread.Join();
}
else
{
my_thread.Abort();
my_thread.Join();
}
}
好像成功了。

谢谢各位!
jvhmr 2003-08-02
  • 打赏
  • 举报
回复
晕~~~~~
cqing 2003-08-02
  • 打赏
  • 举报
回复
this.my_thread.IsBackground = true
jennyq_zq 2003-08-02
  • 打赏
  • 举报
回复
96 should be a combination of suspended and WaitSleepJoin. It is intereting that how you made your thread in such status :).
hnwlk 2003-08-02
  • 打赏
  • 举报
回复
补充:我使用的是Microsoft Visual Studio .NET 2003。
zhangjunjie1 2003-08-01
  • 打赏
  • 举报
回复
我来要分的!哈
swpilogging 2003-08-01
  • 打赏
  • 举报
回复
顶!
hnwlk 2003-08-01
  • 打赏
  • 举报
回复
使用在:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
this.my_thread.Abort();
this.my_thread.Join();
}
提示:
“未处理的“System.Threading.ThreadStateException”类型的异常出现在
mscorlib.dll 中。其他信息: 线程被挂起;正在尝试中止。”
错误。
radioheads 2003-08-01
  • 打赏
  • 举报
回复
abort() ?

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧