2016-09-17 3 views
0

내가 (미니/소형 210) 임베디드 보드를 수행하고 난 C#에서t (VS2005 system.socketsystem.socket.ne 사용하는 응용 프로그램을 구축하려고 않았다 - wince5 장치를 응용 프로그램하지만 내 장치에 wince 6을 가지고 있습니다!)mini210 소켓 멀티 스레드

내 목적은 이더넷을 사용하여 데이터 바이트를 보내고받는 것입니다. 보내기에는 문제가 없지만 수신하려면 멀티 태스킹이 필요합니다.

내가 곧 데이터가 있으면 포트를 수신 할 수 있도록 작업을 시작해야하지만 내 코드에 스레드 부분을 추가하면 전체 프로그램이 중단됩니다 (pc x64 코어 i5에서는 실행되지 않음).하지만 임베디드 보드 그것은 추락 할 것이다.

내가 멀티 태스킹을 제거하는 경우 networkstream.read가 온라인 상태가 아닌 경우 또는 난 일부 데이터가 손실 될 수 있습니다 networkstream.read가 온라인 상태이고 나는까지 응답하지 않습니다 프로그램을 종료 데이터를 기다리고있을 때 타임 아웃. 여기 내 코드 중 일부입니다. 도움이되기를 바랍니다.

이 코드는 수행 업무 :

private void button_connect_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      //Thread TH = new Thread(new ThreadStart(con)); 
      //TH.Start(); 
      con(); 
     } 
     catch 
     { 
      MessageBox.Show("THREAD ERROR"); 
     } 
    } 
    public void con() 
    { 
     try 
     { 
      cli = null; 
      cli = new TcpClient(); 
      cli.Connect(IPAddress.Parse(textBox_ip.Text),Convert.ToInt32(textBox_port.Text)); 
      st = null; 
      st = cli.GetStream(); 
      button_connect.Enabled = false; 
      button_Close.Enabled = false; 
      button_disconnect.Enabled = true; 
      statusBar1.Text = "Connected to server"; 
      //Thread rec = new Thread(new ThreadStart(recf)); 
      //rec.Start(); 
     } 
     catch 
     { 
      MessageBox.Show("Connection faild","Error"); 
      statusBar1.Text = "Faild to connect to server"; 
     } 

이 코드 용량 하지 일 :

private void button_connect_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      Thread TH = new Thread(new ThreadStart(con)); 
      TH.Start(); 
      //con(); 
     } 
     catch 
     { 
      MessageBox.Show("THREAD ERROR"); 
     } 
    } 
    public void con() 
    { 
     try 
     { 
      cli = null; 
      cli = new TcpClient(); 
      cli.Connect(IPAddress.Parse(textBox_ip.Text),Convert.ToInt32(textBox_port.Text)); 
      st = null; 
      st = cli.GetStream(); 
      button_connect.Enabled = false; 
      button_Close.Enabled = false; 
      button_disconnect.Enabled = true; 
      statusBar1.Text = "Connected to server"; 
      //Thread rec = new Thread(new ThreadStart(recf)); 
      //rec.Start(); 
     } 
     catch 
     { 
      MessageBox.Show("Connection faild","Error"); 
      statusBar1.Text = "Faild to connect to server"; 
     } 
    } 

내 작업의 하나가에있는 동안 내가이 충돌납니다 볼 수 두 번째 작업이 주석 처리 된 코드

미리 도움을 주셔서 감사합니다.

답변

0

충돌은 아마도 보조 스레드에서 UI 요소를 업데이트하여 발생합니다.

con 메서드는 텍스트 상자를 읽고 상태 표시 줄뿐 아니라 몇 가지 단추를 업데이트하며 이는 주 응용 프로그램 스레드에서만 발생합니다.

이 문제가 발생하는지 확인하려면 UI 요소에 액세스하는 con 메서드의 줄을 주석 처리하면됩니다 (스레드를 시작하기 전에 텍스트 상자 값을 멤버 문자열로 복사하거나 IP 주소를 하드 코드해야 함) 응용 프로그램을 다시 실행하십시오.

그런 다음 실제로 문제를 해결하려면 Control.Invoke을 조사해야합니다.

관련 문제