关于多线程处理的两个简单问题。。。大家进来看看。。。急。。

duguguiyu1984 2006-07-26 02:42:33
将一个大运算量的函数放在一个线程中执行。
Thread test = new Thread(new ThreadStart(someMethod));
test.Start();
test.Join();
...
用Join是因为下面的操作是需要上面线程中的操作完成后才能执行的步骤。但如果用了Join。界面同样是僵死在那,就没有使用多线程的效果了。想知道如何顺利的实现这样的功能。我个人认为是线程通信的内容,但不知应该如何来做。

第二个问题。程序中涉及到UI控件的大运算量操作。比如,往TreeView中添加大量的结点。于是想利用多线程来完成。但是UI控件的操作无法通过其他线程来调用。查了invoke的使用方法,好像并无效果,想知道具体这样的操作该如何来做。

谢谢。
...全文
508 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyunfan 2007-01-29
  • 打赏
  • 举报
回复
MARK
Knight94 2006-07-28
  • 打赏
  • 举报
回复
to 线程调度是操作系统的事情,cpu资源能自己分配吗?

cpu资源不能有显示分配,但是可以显示通过sleep的方式暂时移出所占有的cpu资源。
viena 2006-07-28
  • 打赏
  • 举报
回复
DoEvent()是把控制权交还给操作系统,处理全部积压消息
界面停止相应是最令我无法忍受的情形之一~

/*
只要合理分配主线程以及子线程的cpu资源,就不需要使用application.doevent这种过时的方法。
*/
线程调度是操作系统的事情,cpu资源能自己分配吗?
duguguiyu1984 2006-07-28
  • 打赏
  • 举报
回复
谢谢大家了。。结贴。。。
duguguiyu1984 2006-07-28
  • 打赏
  • 举报
回复
To:viena(维也纳nn木人 [IQ=50,EQ<0])
为什么啊?

To:Knight94(愚翁)
那DoEvent()处理的是什么事件啊。是主线程中队列的事件吗?

To:GXY2005(不好!我看見豬在天上飛)
第一个:
呵呵,正在研究。
第二个:
恩。知道了。我愿意是无法直接开线程。谢谢。
GXY2005 2006-07-28
  • 打赏
  • 举报
回复
第一个:
是要考虑多线程:楼主没事可以研究下BackgroundWorker 类,微软专门搞的运行后台大程序的。
第二个:
最好在界面中完成。

但是UI控件的操作无法通过其他线程来调用,错误,可以的建立一个线程类,然后
把界面的更新方法委托给这个线程类!
GXY2005 2006-07-28
  • 打赏
  • 举报
回复
呵呵!
viena 2006-07-28
  • 打赏
  • 举报
回复
Application.DoEvents();必须在大运算量的方法内部的
mmens 2006-07-28
  • 打赏
  • 举报
回复
将线程处理封装起来.

建议使用Task模式。可以参考:
http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/SCArchDeGuide/Chapter6UsingMultThr.mspx?mfr=true
Knight94 2006-07-27
  • 打赏
  • 举报
回复
DoEvent是延续以前vb的方法,是解决一些例如主线程耗费很多cpu,同时又能方便响应事件的做法。

那么进入了c#后,已经提供了线程接口,只要合理分配主线程以及子线程的cpu资源,就不需要使用application.doevent这种过时的方法。
duguguiyu1984 2006-07-27
  • 打赏
  • 举报
回复
UP一下
duguguiyu1984 2006-07-27
  • 打赏
  • 举报
回复
大家好。
看来对多线程的理解出现了严重问题。现在开始使用Application.DoEvent()来解决界面停止响应的问题。但还是有一些问题想请教大家。
因为所调用的大运算量方法没有办法修改。也就无法在其中加入Application.DoEvent()。于是我用了一个Timer来轮询调用Application.DoEvent()。效果是:开始的时候还是没有响应,过一会后可以响应界面的移动,重绘等事件,不知道这是机器慢还是什么东西造成的。
在运算之前,我想添加一些滚动的提示信息。我把这些内容封在一个自定义的控件中。但是无法按要求显示相关内容。
总之,我想问的就是Application.DoEvent()可以执行一些什么事件。也就是说什么事件会在这个队列下排队。Timer.tick事件好像就不在这个范围。自控件的相关事件好像也不在,是不是这样的?
相关的伪码如下:
private void aMethod()
{
timer1.enable=true;

childControl.showMessage();//自控件显示信息
someMethod();//大运算量的方法

timer1.enable=false;
}

private void timer1_Tick(object sender, EventArgs e)
{
Application.DoEvents();
}
ProjectDD 2006-07-26
  • 打赏
  • 举报
回复
第一个问题没大看明白,第二个问题,是典型的异步编程模式啊,VS2005的话可以考虑用BackgroundWorker组件来作,(目前我刚好正在学习这部分),或者考虑自定义更为复杂的,基于事件的异步编程方案,(这个比前面一个更复杂)
viena 2006-07-26
  • 打赏
  • 举报
回复
有必要另开一个线程吗?有什么意义?
如果只是为了解决界面停止相应的问题
在你的大运算量操作中间加一句Application.DoEvents();
(比如循环体的内部)
就可以了

如果你有不止一个CPU,
当我没说~
jack6512006 2006-07-26
  • 打赏
  • 举报
回复
将所有东西放在一个方法里面
用一个线程执行
Knight94 2006-07-26
  • 打赏
  • 举报
回复
to 第二个问题。程序中涉及到UI控件的大运算量操作。比如,往TreeView中添加大量的结点。于是想利用多线程来完成。但是UI控件的操作无法通过其他线程来调用。查了invoke的使用方法,好像并无效果,想知道具体这样的操作该如何来做。

ref:
http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
Knight94 2006-07-26
  • 打赏
  • 举报
回复
如果你在创建线程之后立刻调用join,就相当于单线程。
duguguiyu1984 2006-07-26
  • 打赏
  • 举报
回复
...不好意思听得不是很懂。
viena 2006-07-26
  • 打赏
  • 举报
回复
Application.DoEvents();
viena 2006-07-26
  • 打赏
  • 举报
回复
这种情况不宜另开线程
要防止界面停止相应,可以在其中(比如循环内部)加
Application.DoEvents
使消息队列中的消息及时得到处理
加载更多回复(4)

110,539

社区成员

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

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

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