当前线程A创建另一个线程B后,怎样让线程A等待直到线程B完成?
这种问题可以用多线程实现么?
我做了一个winform的程序,有一些比较费时间的操作,执行这些操作时程序就如死了一般长时间不响应了,
为了解决这个问题,我就在main()中创建另一个线程来执行这个操作,但是下一步操作需要这个线程运行的结果,也就是主线程需要等待,使用了Thread.Join(),但是一调用,程序就又“不响应”了,
怎样才能运行这个比较费时操作的时候,使程序不至于“死掉”?,而且那个那个费时间的操作需要循环执行多次,
问题点数:100、回复次数:15Top
1 楼xueyhfeng(小峰)回复于 2005-07-27 20:17:50 得分 0
也就是,主线程被阻塞了,怎么办?Top
2 楼bin_ston(╅不解的风┾)回复于 2005-07-27 20:30:03 得分 5
曾经加了一个记时器解决这个问题Top
3 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-07-27 21:52:19 得分 5
不要阻塞主线程,换别的方法Top
4 楼yizhixiaozhu(天啦,手都起茧了)回复于 2005-07-27 22:08:10 得分 5
不要阻塞线程
试试sleep()
或者干脆将suspend()
然后等B结束后
再将A resume();Top
5 楼ivorstar(单击此处留言)回复于 2005-07-27 22:11:14 得分 5
不要阻塞主线程,把下一步的操作也单独开一个线程,然后阻塞这个线程Top
6 楼yjinter(在在)回复于 2005-07-27 22:11:33 得分 5
提个思路:在B线程中产生个消息,在A中触发一个事件Top
7 楼yjinter(在在)回复于 2005-07-27 22:16:54 得分 0
然后在这个事件中接下去处理没完成的事情。Top
8 楼resp(百无禁忌)回复于 2005-08-08 10:55:16 得分 5
调用的时候lock一下喽Top
9 楼linuxyf(率人哥哥)回复于 2005-08-10 15:45:44 得分 5
用异步委托实现Top
10 楼Flashcom(虫虫)回复于 2005-08-10 15:50:55 得分 5
在执行耗时线程开始时把主窗口所有可以操作的按钮等什么的Enable属性都设为false,等线程执行完后才把相应的控件的Enable属性变回true,这样既不阻塞主线程也不能执行下一步!!Top
11 楼weisunding(鼎鼎)回复于 2005-08-10 15:51:58 得分 50
楼主,看我的。
public bool bFinished = false; //定义全局变量
void Main()
{
bFinished = false;
Thread thA = new ThreadStart(new ThreadStart(thProc));
thA.Start();
while(!bFinished)
{
//开始同步等待直到线程thA执行完
Application.DoEvents();
}
}
void thProc()
{
//执行n多代码
bFinished = true; //这里要看!!!!!
}
Top
12 楼weisunding(鼎鼎)回复于 2005-08-10 15:53:50 得分 0
为了不过多占用CPU,可以在 在 while里面加入 ..Sleep(100);Top
13 楼dafeifei(大飞飞)回复于 2005-08-10 16:12:15 得分 5
用这个信号量,专门用来线程同步的;
System.Threading.Manu*** (竟然记不得了,中文意思是(手动XX),不过在vs中,敲开头就出来了)
这个类。
先准备一下,调用reset()方法。
主线程中调用waitone()方法就是使主线程阻塞。
在另一个线程中调用它的set()方法,就让刚才阻塞的线程继续。你可以在顺利接受到参数后调用他继续。Top
14 楼ybzsu(弑君者)回复于 2005-08-10 16:30:23 得分 5
把下一步定义成一个事件,用回调函数激发事件Top
15 楼ybzsu(弑君者)回复于 2005-08-10 16:34:37 得分 0
while应该和join()一样把,在while的时候主线程照样忙于做while的事,没机会去处理别的事Top





