您的位置:程序门 -> .net技术 -> c#



多线程问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


多线程问题[已结贴,结贴人:liycumt]
发表于:2007-08-29 11:35:00 楼主
线程1   th1   用来更新窗体上一个label   的text
th1=new   thread(new   threadstart(updatelable));
主线程(窗体线程)
  while(true)
  {
    th1.start();
    while(!th1.isalive);
    do   something
}


void   updatelabel()
{  
    while(true)
    label1.text=value1.tostring();
}

但是窗体   上的label1的text并没有更新,虽然value1在不断发生变化
发表于:2007-08-29 11:41:011楼 得分:0
线程1   th1   用来更新窗体上一个label   的text
th1=new   thread(new   threadstart(updatelable));
主线程(窗体线程)
  while(true)
  {
    th1.start();
    while(!th1.isalive);
    do   something
}


void   updatelabel()
{  
    while(true)
    label1.text=value1.tostring();
    label1.refresh();     //此处加个刷新
}
发表于:2007-08-29 11:57:172楼 得分:0
但是问题好像是   要等    
  while(true)
  {
    th1.start();
    while(!th1.isalive);
    do   something
}

加了label1.refresh();     //此处加个刷新
循环结束后,th1   才能开始得到执行,这是为什么?
发表于:2007-08-29 12:47:063楼 得分:20
void   updatelabel()
{  
    while(true)
{
    label1.text=value1.tostring();
    label1.refresh();     //此处加个刷新
}
}

修改一下解决。少一个括号。呵呵~~~
发表于:2007-08-29 12:55:184楼 得分:0
不过你这样做会占用很多系统资源,用线程通讯比较好。多线程实际上有两种做法,一个是自己开一个线程自己管理,另外一个是用异步的委托代理。你用第一种,我帮你改一下

private   static   manualresetevent   alldone   =   new   manualresetevent(false);

主线程(窗体线程)
  while(true)
  {
alldone.reset();
    th1.start();
    //while(!th1.isalive);
alldone.wait();   //   挂起,等待子线程结束
    do   something
}

void   updatelabel()
{  
    while(true)
{
    label1.text=value1.tostring();
    label1.refresh();     //此处加个刷新
}
alldone.set();   //   通知主线程继续运行
}
发表于:2007-08-29 12:58:245楼 得分:0
不好意思,看错了,你用的是while(!th1.isalive);那么子线程应该改如下

void   updatelabel()
{  
alldone.set();   //   子线程开始,通知主线程继续运行
    while(true)
{
    label1.text=value1.tostring();
    label1.refresh();     //此处加个刷新
}
}
发表于:2007-08-29 13:44:376楼 得分:0
谢谢楼上几位提供的方法   我是了下   还是不好用
我的需求是这样的
在窗体上有个label   它用来即时显示正在处理文本文件中的第   几条记录,
主线程main   函数读取   每次读取   文本一行并处理
发表于:2007-08-29 13:58:277楼 得分:0
如果吧th1   设置为   后台线程   有什么关系么
发表于:2007-08-29 14:46:398楼 得分:0
to   碧海蓝天
如果我在   主线程(窗体线程)加一个messagebox。show();
则   th1   就能得到执行
  while(true)
  {
    th1.start();
    while(!th1.isalive);
    do   something
    messagebox.show();//   后加德     不知道为什么?
}
发表于:2007-08-29 15:27:499楼 得分:0
不知为不知,我都是做后台的,几乎没有接触到ui,不是很清楚ui的东西。

一般多线程流程应该如此:

主线程开始   ->   计数器归0   ->   启动子线程1读取文本   ->   启动子线程2定时刷新界面   ->   主线程结束(这里不结束,界面会卡住)

子线程1开始   ->   读取文本   ->   开始循环处理每一条记录
子线程1循环体   ->   处理记录   ->   处理纪录结束,计数器加1   ->   下一条记录
循环结束   ->   通知子线程2处理结束   -> 子线程2停止

子线程2开始   ->   死循环,直到线程1结束
死循环   ->   读取计数器   ->   刷新label   ->   如果处理结束,则用break跳出循环,否则thread.sleep(25)   ->   继续循环(这里25毫秒刷1次就可以了,不然系统速度狂降)
循环结束后   ->   最后一次读取计数器   ->   刷新label   ->   子线程2停止
发表于:2007-08-29 15:30:0910楼 得分:0
循环结束   ->   通知子线程2处理结束   ->   子线程1停止   //   这里写错,是1停止不是2停止
发表于:2007-08-30 08:54:0411楼 得分:0
to   碧海蓝天  
我还是   用了这个private   static   manualresetevent   方法。
用了两个     manualresetevent对象,alldone,   mr,   alldone负责主线程,mr   负责   刷新label   的线程。   在主线程里   控制   mr、   在刷新label线程里控制alldone,使两个线程交替执行。
谢谢你的竭力帮助


快速检索

最新资讯
热门点击