代码之家  ›  专栏  ›  技术社区  ›  foraidt

如何在单独的线程中创建带有进度条的MFC对话框?

  •  9
  • foraidt  · 技术社区  · 16 年前

    我的想法是在连接到DB之前,在单独的线程中创建一个带有进度条的对话框。此对话框将使用持续更改进度状态 CProgressCtrl::StepIt() 所以用户看到了一些事情发生了。
    在该对话框设置完成后,我想从主线程调用DB connection函数。 连接函数完成后,我想停止进度条线程。

    CMyApp::       ProgressThread
    InitInstance()      .
        |               .
        |               .
        +-Create Dialog-+
        |               |
        |             Animate
     Connect          Progress
        to             Bar
        DB              |
        |               |
        +-Destroy Dlg---+
        |               .
        |               .
    

    可能吗?如果是,如何进行?

    1. 我知道 CProgressCtrl::SetMarquee() 这可能正是我需要的,但我不能使用它,因为应用程序不支持Unicode。

    更新2

    起初,我担心如何处理错误,但事实上这与以前的情况非常相似。

    1. 在主线程中,我创建了一个带有连接参数、结果标志和线程运行标志的结构。后者最初设置为 true
    2. 我创建一个线程并将该结构作为参数传递。
    3. 我创建了一个在主线程中显示进度条的对话框。
    4. 在主线程中还有一个循环,该循环在设置线程运行标志时运行。它叫 CMyDialog::Animate() CProgressCtrl::StepIt() 然后 Sleep() 有一点。
    5. false 完成后。

    缺点: 将鼠标移到窗口上不起作用。它是隐形的。因此,不能使用“取消”按钮或其他交互式对话框元素。不过,我可以接受。

    CMyApp::        WorkerThread
    InitInstance()      .
        |               .
        |               .
    Create Dialog       .
        |               .
        +-Start Thread--+
        |               |
        |             Connect
     Animate            to
     Progress           DB
       Bar              |
        |               |
        +-Thread Ends---+
        |               .
     Destroy Dlg        .
        |               .
    
    5 回复  |  直到 16 年前
        1
  •  2
  •   AlexEzh    16 年前

    将DB连接逻辑移动到单独的线程会更安全。使用对话框线程上的DB,可以重新绘制进度条,但不能重新绘制对话框中的其他控件。

        2
  •  7
  •   Kirill V. Lyadvinsky    16 年前

    我希望 this

        3
  •  2
  •   Shay Erlichmen    16 年前
    1. 使用创建工作线程 AfxBeginThread
    2. 在该线程中创建一个 CProgressCtrl 打电话 Create ,将对话框作为CProgressCtrl的父级传递,将选框样式用于进度控件。
    3. 味精;
      while(GetMessage&Msg,NULL,0,0)

      翻译信息;味精);
      发送消息(&味精);

    4. 消息循环需要检查全局标志以查看是否退出循环。

        4
  •  1
  •   Javier De Pedro    16 年前

    SendMessage 具有 PBM_SETMARQUEE 而不是 SetMarquee

    StepIt 在进度栏中。 您还可以在ui线程中创建进度条,并使用工作线程的自定义消息修改进度状态。

    无论如何,我同意AlexEzh的观点,最好的方法是让整个非UI在工作线程中工作。

        5
  •  1
  •   TKV    12 年前

    创建一个成员变量作为

    CProgressCtrl m_progress;
    

    m_progress 在里面 DDX_Control 在里面 DoDataExcchange 使用进度条ID

    在按钮单击功能下添加以下代码。

    m_progress.setRange(0,100);
    m_progress.SetPos(1);