0

Visual Studio VC++ 2010 クラス ライブラリを使用して、2 つのタイマーを使用します。1 つはセンサーの読み取り用で、もう 1 つはロボットにコマンドを与えるためのものです。

ボタン 1 をクリックすると最初のタイマーがオンになり、ボタン 3 を使用すると 2 番目のタイマーがオンになります。

しかし、ボタン 2 をクリックすると、ボタン 1 を押さなくても読み取りセンサーが機能し、その逆も同様です。

ここに私のプログラムがあります:

私のコードの何が問題なのですか?

const int cTimer1 = 1;
const int cTimer2 = 1;

 void CENVSConfigDlg::OnBnClickedButton1()
{
SetTimer(cTimer1,1000,NULL);
}

 void CENVSConfigDlg::OnBnClickedButton2()
{
KillTimer(cTimer1);
}

 void CENVSConfigDlg::OnBnClickedButton3()
{   
SetTimer(cTimer2,10,NULL);  
}

void CENVSConfigDlg::OnBnClickedButton4()
{
    KillTimer(cTimer2);
}

void CENVSConfigDlg::OnTimer(UINT_PTR ID){
if(ID==cTimer1){

    char buffer[30],tempStr[5];
    int sensor[6];

    DWORD nbytes;

    MessageBeep(0);

    //Read Sensors

    if(!WriteFile( hnd_serial, "1", 1, &nbytes, NULL )){KillTimer(cTimer1);MessageBox(L"Write Com Port fail!");return;}
    Sleep(30);
    if(!ReadFile( hnd_serial, buffer, 30, &nbytes, NULL )){KillTimer(cTimer1);MessageBox(L"Read Com Port fail!");return;}
    Sleep(300);



if(ID==cTimer2)
{
    if(GetAsyncKeyState(0x53) != 0)
 {
 DWORD nbytes;
if(!WriteFile( hnd_serial, "s", 1, &nbytes, NULL )){MessageBox(L"Write Com Port fail!");return;}
    Sleep(30);
 tampil.SetWindowText( (LPCTSTR)"s" ); //backward
 }

else if(GetAsyncKeyState(0x57) != 0)
{
    DWORD nbytes;
if(!WriteFile( hnd_serial, "w", 1, &nbytes, NULL )){MessageBox(L"Write Com Port fail!");return;}
    Sleep(30);
    tampil.SetWindowText( (LPCTSTR)"w" );//forward
}


}

}


}
4

1 に答える 1

0

自分の間違いを見つけたのは良いことです。しかし、コードにはまだいくつかの不具合があります。

  • WM_TIMERタイマー(メッセージ)自体で読み取り、書き込み、スリープを実行しています。これにより、UI スレッドがフリーズします。UI の更新以外の処理を行うには、別のスレッドを使用することをお勧めします。
  • タイマー ID は などのようTimer1に名前が付けられTimer2ていますが、これはプログラマにとって使いやすいものではありません。実際の意味を反映するために、より適切な名前を使用する必要があります。
  • 複数のタイマーは同時に動作しません。繰り返しますが、マルチスレッドを使用することをお勧めします!
于 2013-04-06T09:36:11.990 に答える