【问题标题】:Where do I put the logic of my MFC program?我将 MFC 程序的逻辑放在哪里?
【发布时间】:2010-05-16 02:16:41
【问题描述】:

我用 C++ 创建了一个应用程序核心,并在 Visual Studio 中将其编译到一个静态库中。我现在正在为它编写一个 GUI。 我正在使用 MFC 来执行此操作。我想出了如何映射按钮按下以执行我的应用程序核心主类的某些方法(即启动和停止的按钮)。 然而,核心类应该始终每隔一两秒从外部源采样一次数据。然后,GUI 应在获取每个样本后填充一些字段。我似乎无法在我的 MFC 对象(如 CDialog)中找到一个位置,我可以不断检查我的类是否已获取数据。然后是否已将该数据放入某些文本框中。

一位朋友建议我在 OnInit() 例程上创建一个线程来处理此问题,但该解决方案对我来说并不真正有效。

没有地方可以放置一个一直被调用直到程序退出的 if 语句吗?

if( coreapp.dataSampleReady() ) {
  // put coreapp.dataItem1() in TextBox1
  // set progress bar to coreapp.dataItem2()
  // etc.
  // reset dataSampleReady
}

【问题讨论】:

    标签: c++ mfc logic


    【解决方案1】:

    您提到“每隔一两秒”,而另一个答案建议“使用事件驱动的范例”。如何在对话框中设置一个计时器,当计时器触发时,从外部源中采样数据。您表示您已经知道如何为按钮映射事件处理程序,因此将处理程序映射到计时器应该是您的自然扩展。

    【讨论】:

    • 一段时间后我想通了,所以这就是我用作解决方案的方法。因为我下面的 dataSampleReady() 只是从时钟轮询时间并将其与“轮询时间”进行比较。
    【解决方案2】:

    我想你可以把它放在OnIdle

    您最好使用事件驱动范例,尽管轮询系统会过度消耗 CPU 功率。因此,您有一个位于WaitForSingleObject 中的线程。设置 dataSampleReady 后,您需要做的就是触发线程正在等待的事件。这样,您就不会不断地消耗 CPU 电源来检查某些东西。在需要之前,它将等待其他进程和线程。

    【讨论】:

    • OnIdle 的问题在于,我的appcore 类是我的CDialog 类的成员,而CDialog 类是CWinApp 类的成员。那么我的解决方案是让 CDialog 的构造函数获取指向我的 coreapp 的指针(然后将其保存为成员),并在 CWinApp 类中创建我的 coreapp 类吗?
    • 那么 OnIdle 肯定可以在对话框中调用访问器成员吗?不要忘记你总是可以通过 AfxGetApp() 访问你的 CWinApp 派生类
    猜你喜欢
    • 2012-01-22
    • 2016-03-08
    • 1970-01-01
    • 2014-03-16
    • 2018-06-14
    • 2013-11-14
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多