代码之家  ›  专栏  ›  技术社区  ›  Clément

NET:了解application.run()的工作方式

  •  2
  • Clément  · 技术社区  · 14 年前

    汉斯·帕桑特给了我一个很好的答案 here 所以我想问更多的细节来理解 Application.Run() 作品。

    据我从医生那里了解,似乎 应用程序.run() 在当前线程上启动消息循环,从而使其能够处理用户输入(对吗?).重载版本 Application.Run(Form) 基本上是一样的,只有当表单关闭时它才存在,并且默认情况下它显示表单。

    这就提出了几个问题:

  • 一个人怎么做才能简单地从 Main() 子函数可以与用户通信(消息框等)并等待其退出?
  • 当消息循环在没有窗体的情况下启动时,如何从该循环启动一个新窗体,并等待它退出? ShowDialog 可以工作,除非您不希望表单在启动时立即显示(例如,如果您的for that已启动,则最小化为系统托盘)
    • 基本上,情况如下:sub'main'有一个任务列表,在20分钟内执行,系统托盘图标告诉用户程序将在20分钟内运行。计时器在20毫秒后滴答作响,每次创建进度对话框的实例(最初隐藏在任务栏中),都必须逐个执行大约15个任务。
    • ` showdialog`将显示不需要的表单;因此,我要做的方法是将进度对话框的回调传递给启动下一个任务的函数。但这不会在第二个进度表退出之前退出第一个进度表,是吗?这意味着15张表格最终会被打开…
    • 所以解决方案可能是调用(begininvoke?)主应用程序循环上的回调…只是,我不知道怎么做,因为我没有一个与循环关联的窗体来调用上的回调…

    我希望我的问题是清楚的(我可能会混淆很多事情,对不起)。
    谢谢,
    CFP。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Hans Passant    14 年前

    Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
        If Not Me.IsHandleCreated Then
            value = False
            Me.CreateHandle
        End If
        MyBase.SetVisibleCore(value)
    End Sub
    

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Me.Show()
        ProgressBar1.Visible = True
        Me.Enabled = False
        BackgroundWorker1.RunWorkerAsync()
    End Sub
    

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        '' Do stuff here, call BackgroundWorker1.ReportProgress to update the PB
    End Sub
    
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub
    
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        ProgressBar1.Visible = False
        Me.Enabled = True
        Me.Hide()
    End Sub