0

我正在做一个测量系统,我的程序中有一个 do while 循环。在循环中,它会在进行测量之前检查是否有任何电机正在移动,因为它要求它在做任何事情之前到达目标位置。

在进行测量时,假设告诉我进行此测量需要多长时间。

但是,每当它在 do while 循环中运行时,我的所有计时器功能都会停止,就好像它们进入睡眠模式一样。

还有其他方法可以实现吗?如果有,请帮助我。

任何帮助将非常感激。

SetTimer(TIMERECHO, 1000, NULL);

BOOL bMoving = FALSE;
do
{
    if (IsMoving(ID, NULL, &bMoving)) 
        GetPosition();
} while (bMoving);


void CLHMDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
        case TIMERECHO:
            UpdateData(FALSE);
            m_Seconds++;
            m_TimerEcho.Format(_T("Total time: %ds"), m_Seconds);
            break;
    }
    CDialogEx::OnTimer(nIDEvent);
}
4

3 回答 3

1

MFC 有一个消息循环,用于获取和分派 WM_TIMER 等消息。如果您执行 while 循环,则消息循环未运行。它不是在睡觉,它只是在等你停止占用处理器。

您有两个选择: (1) 摆脱冗长的循环并定期对 WM_TIMER 消息执行任何操作。(2) 使用第二个线程来执行冗长的操作。这对初学者来说有很多困难。

于 2013-07-19T02:46:24.870 回答
0

让您跑步的一个非常简单的解决方案(但并不完美)是将您IsMoving的计时器移至如下所示:

void CLHMDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
        case TIMERECHO:
           if (IsMoving(ID, NULL, &bMoving)) 
              GetPosition();

            UpdateData(FALSE);
            m_Seconds++;
            m_TimerEcho.Format(_T("Total time: %ds"), m_Seconds);
            break;
    }
    CDialogEx::OnTimer(nIDEvent);
}

但是,对于正确的解决方案,您必须为此使用线程,其复杂性也会因简单到更好的解决方案而有所不同。我已经为您即时编写了一些代码,它可能无法编译,但您明白了。

AfxBeginThread(monitor_motor, this);

UINT monitor_motor(LPVOId lParam)
{
CMyDlg * dlg = (CMyDlg *) lParam;
HWND hWnd = (HWND) dlg->m_hWnd;


do
{
    if (IsMoving(ID, NULL, &dlg->bMoving)) 
        GetPosition();

    Sleep(100); // maybe you don't have to poll too hard and give other hardware chance to communicate?..that's upto you

    PostMessage( hWnd, UPDATE_TIMER_AND_STUFF );
} while (dlg->bMoving);

PostMessage( hWnd, UPDATE_MOTOR_MOVED_COMPLETELY );

}
于 2013-07-21T05:41:17.847 回答
0

这是因为您的循环没有处理消息。onTimer 作为 Windows 消息的结果被调用。您需要在循环中继续处理消息或使用基于回调的计时器。

一种方法是使用 CreateTimerQueueTimer http://msdn.microsoft.com/en-us/library/windows/desktop/ms682485%28v=vs.85%29.aspx

于 2013-07-19T02:22:58.283 回答