在程序中使用while循环时,应用程序不会退出

时间:2014-02-12 07:22:24

标签: visual-c++ visual-studio-2012 c++-cli

我在visual studio 2012 c ++中创建了一个应用程序。我们的想法是从串口读取数据并相应地改变标签的颜色。我使用while循环以连续的方式改变颜色。现在,应用程序运行正常。我面临的问题是当我点击应用程序中的退出按钮或“x”按钮时应用程序不存在。我只能通过单击结束任务才能在任务管理器中关闭。以下是我的申请代码。请告诉我有没有办法解决这个问题

 while(checkBox1->Checked)
         {
            if(this->serialPort1->IsOpen)
            {
                    int b[4] = {0};
                    int *ptr1;
                    ptr1 = b;
                    //this->serialPort1->DiscardInBuffer();
                    for (int i=0; i<4; i++)
                    {
                        *ptr1 = this->serialPort1->ReadChar();
                        ptr1++;
                    }
                    int address;
                    address = ((b[0]-48)*10)+(b[1]-48);
                    System::Windows::Forms::Label ^ ptr;

                    switch (address)
                    {
                        case 1: ptr = label1; 
                            break;
                        case 2: ptr = label2;
                            break;
                        case 3: ptr = label3;
                            break;
                        case 4: ptr = label4;
                            break;
                        case 5: ptr = label5;
                            break;
                        case 6: ptr = label6;
                            break;
                        case 7: ptr = label7;
                            break;
                        case 8: ptr = label8;
                            break;
                        default: //MessageBox::Show("Default Case");
                            break;
                    }
                    if(b[2]=='o')
                    {
                        ptr->BackColor = Color::Red;
                        ptr->Text="R";
                    }
                    else if(b[2]=='a')
                    {
                        ptr->Text=String::Empty;
                        ptr->BackColor = Color::Green;
                    }
                    else if(b[2]=='i')
                    {
                        ptr->Text=String::Empty;
                        ptr->BackColor = Color::Blue;
                    }
                    if ((b[3]-48)<3)
                    {
                        ptr->Text=String::Empty;
                        ptr->BackColor = Color::SaddleBrown;
                        //_sleep(5000);
                    }

1 个答案:

答案 0 :(得分:2)

如果您进行UI编程,则必须使用事件驱动机制!在您的情况下,您应该注册“DataReceived”事件,以便在新数据从端口到达时被调用。

private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e)
{
    array<unsigned char> ^data = gcnew array<unsigned char>(4);
    serialPort1->Read(data, 0, 4);
    // Do whatever you want...
}

在事件处理程序“checkBox1_CheckedChanged”中,您应该只是打开或关闭串口!

private: System::Void checkBox1_CheckedChanged(System::Object^  sender, System::EventArgs^  e) 
{
  if (checkBox1->Checked)
  {
      serialPort1->Open();
  }
  else
  {
      serialPort1->Close();
  }
}

另外我建议将“read theresehold”设置为4 ...

serialPort1->ReceivedBytesThreshold = 4;