高分求进度提示代码,如能解决,给200分!!!

donger2000 2003-11-26 09:57:49
在MDI主窗口中,打开新窗口速度较慢,想做一个进度提示窗口,即:
在打开子窗口前,显示一个小窗口,提示用户等待,等打开完成后,关闭提示窗口。
如果提示窗口中放进度条,那么如何确定当前执行了多少?
我现在的做法是在小窗口中放一个动画GIF,但问题是这个动画根本就不会动,改用多线程后,动画会动了,但又有一个问题:如果打开窗口速度比较快,那么提示窗口的线程会被提前中止,从而产生一个错误。

注:不希望听到理论上的东西,因为我已经试了很多方法,一直没成功,只希望哪位高手给一段调试通过后的代码!代码可以简单一些,有以下功能就行:
在某一窗口中放一按钮,点击后,打开一个带有动画的小窗口,然后后台接着执行一段程序(可以是从1至N的循环也行),执行完毕后,关闭小窗口。

另外,如果你有办法 获取打开一个窗口过程的执行进度,那也行。

在此,先谢了!
...全文
44 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
donger2000 2003-11-29
  • 打赏
  • 举报
回复
在结束子线程之前加Form2.Close()好象就没出现线程被中止的提示了!谢谢!
ArLi2003 2003-11-29
  • 打赏
  • 举报
回复
子线程只有一条主线吧,就是用来显示窗口,我早期做过的一个软件:api explore 就是这样做的。

你不要去结束线程,而去关闭窗口就行了呀,窗口.close 肯定在构造之后

你可以

class form2{
public void closeme() {
this.close()
}
}

然后在form1(主窗口) 里去调这个提示窗口的 closeme 方法,肯定在提示窗口的构造完成之后,而不会发生在创建提示窗口过程中

比如

form2.closeme(); //再close 而不管是否在执行布局,反正布局之后会close

线程的基本任务图是

主线程 -> public Form2 form2 = new Form2() -> 创建新线程1 负责主任务 -> form2.ShowDialog(this) ->主窗口消息被挂起,提示窗口出现 -| 永久等待

-> 新线程1 开始 -> 主窗句柄.SuspendLayout() -> 处理事务 -> 完成后执行 主窗句柄.form2.closeme() -> 主窗句柄.ResumeLayout() -| 线程自然结束

// 其中的 SuspendLayout 是考虑如果有主窗口的listview.item.add 之类的可以提高处理速度,可以酌情使用
py3zhsh 2003-11-28
  • 打赏
  • 举报
回复
學習
donger2000 2003-11-28
  • 打赏
  • 举报
回复
我的意思是这样:我本来是想放进度条的,但问题是我又不能掌握执行我的主事件的进度,所以就放一下动画让用户等待,就好比IE打开网页的过程中,不是有个转动的图标吗?

TO:ArLi2003
用两线程,如果子线程已经成功打开并显示提示窗口了,此时结束子线程,就不会提示出错,
但如果正在创建提示窗口,而此时主线程已经执行完毕,并要结束子线程,就会出错了
ssdjmcj8048 2003-11-28
  • 打赏
  • 举报
回复
你是不是在子线程中创建的子窗体?
如果是,你的错误可能是在创建子窗体的过程中修改了窗体(或有关窗体的操作),在子线程中修改窗口是不安全的!
如果有这样的操作,要调用主窗体的Invoke或BeginInvoke来执行这些修改窗体的操作!
frmMain.Invoke(new MethodInvoke(你的修改窗体的方法名称));
ssdjmcj8048 2003-11-28
  • 打赏
  • 举报
回复
citymeteor(流星) 的回答中Gif确实会动,但前提是在创建子窗体的过程中有机会写Application.DoEvents,可能那个过程是个黑箱!
ArLi2003 2003-11-28
  • 打赏
  • 举报
回复
必须多线程,你的“如果打开窗口速度比较快,那么提示窗口的线程会被提前中止,从而产生一个错误” 是什么意思?
rock1981 2003-11-27
  • 打赏
  • 举报
回复
up
lcg200x 2003-11-27
  • 打赏
  • 举报
回复
不用线程,然后在执行代码的时候写application.doevents();
动画应该能动!然后那个窗体启动起来以后关掉wait窗体,ok了!
韩小明 2003-11-27
  • 打赏
  • 举报
回复
我看楼主的问题是:想用gif文件作为进度标志?

不然怎么必须动画要动?
tjq_tang 2003-11-27
  • 打赏
  • 举报
回复
没有办法最好是启动一个线程
donger2000 2003-11-27
  • 打赏
  • 举报
回复
你的Form2上有GIF动画吗?会动吗?
我试了,不会动的
白掌柜 2003-11-27
  • 打赏
  • 举报
回复
更完整点:
/// <summary>
/// 子窗口构造函数
/// </summary>
public Form3()
{

//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
Form2 frm = new Form2();
frm.Show();
this.Enabled = false;//当前窗口不响应用户操作
for ( int i = 1 ; i < 10000 ; i ++ )
{
Console.WriteLine ( i.ToString() );
Application.DoEvents();
}
this.Enabled = true;
frm.Close();//进度窗口
}
白掌柜 2003-11-27
  • 打赏
  • 举报
回复
Doevent方法可以。

Form2 frm = new Form2 ();
frm.Show ();
this.Enabled = false;
for ( int i = 1 ; i < 10000 ; i ++ )
{
Console.WriteLine ( i.ToString() );
Application.DoEvents();
}
this.Enabled = true;
frm.Close();
donger2000 2003-11-27
  • 打赏
  • 举报
回复
lcg200x(黑脑龙) 的方法我之前就试过了,不行的

110,536

社区成员

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

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

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