请教一个winform程序的小问题

qiance 2009-04-22 11:18:36
现在有个简单的winform程序,比如现在单击一个按钮,事件里面是处理一些东西,然后把结果显示在在richtextbox里面

比如事件的大致过程是这样的

richtextbox.Text="开始...";
sleep(1000);//假设这段过程要花费一秒钟的时间做啊
richtextbox.Text="处理了步骤一...";
sleep(1000);
richtextbox.Text="处理了步骤二...";
sleep(1000);
richtextbox.Text="处理了步骤三...";


我想要它输出的结果是先输出“开始”,然后等一秒种,接着显示下面,然后再等一秒钟,然后。。。依次这样

现在却碰到是点击按钮后 过了三秒钟(sleep的结果)
然后它一下子把所有的文本都显示出来


请问下这有什么办法解决,让程序能按着顺序执行的步骤顺序显示,就像在console程序下那样


谢谢
...全文
164 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiance 2009-04-23
  • 打赏
  • 举报
回复
是没你的快
但是万一不是richtextbox要显示
是别的组件呢
那不是没有这个方法了
tianyong0913 2009-04-22
  • 打赏
  • 举报
回复
是线程隔一分钟启动
qiance 2009-04-22
  • 打赏
  • 举报
回复
这个方法行。。嘿嘿
我看下Application.DoEvents();的用途
cppfaq 2009-04-22
  • 打赏
  • 举报
回复
Application.DoEvents()


coderichTextBox1.Text = "开始...";
Thread.Sleep(1000);//假设这段过程要花费一秒钟的时间做啊
richTextBox1.Text = "处理了步骤一...";
Application.DoEvents();
Thread.Sleep(1000);
richTextBox1.Text = "处理了步骤二...";
Application.DoEvents();
Thread.Sleep(1000);
richTextBox1.Text = "处理了步骤三...";
Application.DoEvents();
qiance 2009-04-22
  • 打赏
  • 举报
回复
这搞得是不是复杂了
要的就是个很简单的效果
你看下15楼讲的
cppfaq 2009-04-22
  • 打赏
  • 举报
回复

Application.DoEvents()

richTextBox1.Text = "开始...";
Thread.Sleep(1000);//假设这段过程要花费一秒钟的时间做啊
richTextBox1.Text = "处理了步骤一...";
Application.DoEvents();
Thread.Sleep(1000);
richTextBox1.Text = "处理了步骤二...";
Application.DoEvents();
Thread.Sleep(1000);
richTextBox1.Text = "处理了步骤三...";
Application.DoEvents();
qiance 2009-04-22
  • 打赏
  • 举报
回复
我这也没必要用到线程把。。
你看这个。。。。

private void button1_Click_1(object sender, EventArgs e)
{
toolStripStatusLabel.Text = "分析中,请稍等。。";
/*中间在分析什么的一些操作*/
toolStripStatusLabel.Text = "分析中,请稍等。。";
}
想要的效果是点击按钮,显示 "分析中,请稍等。。"
然后在分析。。。
过段时间后分析完毕
最后显示"完毕"..

这样就第一条语句根本执行不到
点击按钮后果了一段时间直接显示“完毕”

这到底是什么原因啊
liucuiqiang 2009-04-22
  • 打赏
  • 举报
回复
backgroundwork吧
qiance 2009-04-22
  • 打赏
  • 举报
回复
对啊
好像就是这样
我以前用delphi的时候
是实时刷新的

这里干嘛要设计成这样子
EsMo 2009-04-22
  • 打赏
  • 举报
回复
richtextbox.Text="开始...";
Application.DoEvent();
sleep(1000);//假设这段过程要花费一秒钟的时间做啊
richtextbox.Text="处理了步骤一...";
Application.DoEvent();
sleep(1000);
richtextbox.Text="处理了步骤二...";
Application.DoEvent();
sleep(1000);
richtextbox.Text="处理了步骤三...";
Application.DoEvent();
流梓 2009-04-22
  • 打赏
  • 举报
回复
用一笨方法也可以LZ
Private MessageLog(1000) As String
Private Sub ShowMessage()

MessageLog(0) = "1"
MessageLog(1) = "2"
MessageLog(2) = "3"
MessageLog(3) = "4"
MessageLog(4) = "5"
Me.Timer1.Enabled = True
End Sub
Private i As Integer = 0
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If MessageLog(i) <> String.Empty Then
Me.RichTextBox1.AppendText(MessageLog(i) & vbCrLf)
End If
i += 1
End Sub
大概意思是这样的!LZ 转下C#好了
qiance 2009-04-22
  • 打赏
  • 举报
回复
还有个就是
刚刚用refresh可以达到这个效果了
但是如果想这样该怎么办啊
private void button1_Click_1(object sender, EventArgs e)
{
toolStripStatusLabel.Text = "分析中,请稍等。。";
/*中间在分析什么的一些操作*/
toolStripStatusLabel.Text = "完毕";
}
这样就第一条语句根本执行不到
点击按钮后果了一段时间直接显示“完毕”

这到底是什么原因啊
xzsnj 2009-04-22
  • 打赏
  • 举报
回复
这和控件的事件执行方式有关,比如说listbox控件,你每次添加新数据进去,系统默认一直到最后一次操作完成后才会刷新数据
流梓 2009-04-22
  • 打赏
  • 举报
回复
thread.sleep(1000);
在winfrom显示时,其时后台已经是sleep(1000)的,但为什么LZ会看到一下子全部显示出来。

个人原分析:一、LZ没用到线程?
二、可以试着用一个timer来显示
qiance 2009-04-22
  • 打赏
  • 举报
回复
我这里只是想用sleep说明下问题
并不是真正的sleep
就是那段时间是程序在处理的一个过程
visualyou 2009-04-22
  • 打赏
  • 举报
回复
拖一个Timer控件,设置interval为1000

写如下代码
private void button1_Click(object sender, EventArgs e)
{
this.richTextBox1.Text = "开始...\n";
timer1.Start();

}

int i = 0;
private void timer1_Tick(object sender, EventArgs e)
{
i++;
richTextBox1.AppendText("处理了步骤" + i + "\n");
}

如果不想用Timer,直接用线程控制也行。思路一样
ericzhangbo1982111 2009-04-22
  • 打赏
  • 举报
回复
richTextBox1.Text = "开始...";

Thread t = new Thread(new ThreadStart(run));
t.Start();
Thread.Sleep(1000);
richTextBox1.Text = "处理了步骤一...";

richTextBox1.Text = "处理了步骤二...";

richTextBox1.Text = "处理了步骤三...";




private delegate void st();

private void ss()
{
richTextBox1.Text = "处理了步骤一...";
}
private void run()
{
st s = new st(ss);
Invoke(s);
}

差不多这个意思 自己改改吧,


chowyi 2009-04-22
  • 打赏
  • 举报
回复
你的线程没有调度好
phommy 2009-04-22
  • 打赏
  • 举报
回复
 richtextbox.Text = "开始...";
richtextbox.Refresh();
Thread.Sleep(1000);//假设这段过程要花费一秒钟的时间做啊
richtextbox.Text = "处理了步骤一...";
richtextbox.Refresh();
Thread.Sleep(1000);
richtextbox.Text = "处理了步骤二...";
richtextbox.Refresh();
Thread.Sleep(1000);
richtextbox.Text = "处理了步骤三...";


真罗剑 2009-04-22
  • 打赏
  • 举报
回复
可以用定时器吗?
加载更多回复(6)

111,126

社区成员

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

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

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