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

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 メッセージの結果として呼び出されます。ループ内でメッセージを処理し続けるか、コールバック ベースのタイマーを使用する必要があります。

1 つの方法は、CreateTimerQueueTimer http://msdn.microsoft.com/en-us/library/windows/desktop/ms682485%28v=vs.85%29.aspxを使用することです。

于 2013-07-19T02:22:58.283 に答える