0

私は GPS 車両追跡プロジェクトに取り組んでいます。ここでは、緯度と経度の信号をポート 5000 の特定の IP (静的 IP) に送信するために使用されるデバイスです。合計 17 個のデバイスがあります。

私の問題は、17 台すべてのデバイスがアクティブ化されているときに、適切な時間内にすべてのデバイスから測定値を取得できないことです。これは、デバイス 1 の読み取り値を取得した場合、そのデバイスから 5 ~ 6 個の読み取り値を継続的に取得し、その後デバイス 2 の読み取り値を 5 ~ 6 回継続して取得することを意味します。

ここで私が言おうとしているのは、すべてのデバイスが 1 分ごとに読み取り値 (緯度と経度) を IP に送信するということですが、デバイスから信号を取得すると、5 ~ 6 分後にデバイス 1 からのみ取得されます デバイス 2次に 3 。

私の問題は、アプリケーションがパケットを失っていることです。これは、アプリケーションがデバイス 17 からデータを受信して​​いるときに、アプリケーションが最後の 5 ~ 6 分間の読み取り値を受信して​​いるが、過去 10 ~ 30 分の読み取り値を失っていることを意味します。

1 つのソケットを使用して、すべてのデバイスから同じポートに並列に信号を取得するにはどうすればよいですか?

これは私が実装したコードです:

Thread th_main, th_sub;
bool bool_Start_subTH;
Socket Socket_Client;
TcpListener objListener;


private void Form1_Load(object sender, EventArgs e)
{
    bool_Start_subTH=false;
    th_main = new Thread(GetDataFromClient);
    th_main.Start();
 }

void GetDataFromClient()
{
    objListener = new TcpListener(5000);
    objListener.Start();
    while (th_main.IsAlive)
    {
        Socket_Client= objListener.AcceptSocket();
        if(!bool_Start_subTH)
        { 
            th_sub=new Thread (SubFunctionThread);
            th_sub.start();
            bool_Start_subTH=false;
        }
    }
 }

void SubFunctionThread()
{
    while(th_sub.IsAlive)
    {
        if(Socket_Client.Avilable>0)
        {
            byte[] something = new byte[Socket_Client.Available];
            Socket_Client.Receive(something);
            string strmessage = Encoding.ASCII.GetString(something);
            Listbox1.Items.Add( strmessage);        
        }
    }
}
4

1 に答える 1

0

問題はクライアントを処理するスレッドにあると思います。すべての CPU を消費するループにとどまります。Available を避けて、ソケットを直接読み取る必要があります (実際、これだけで十分です。何かが入るまで待つ必要があります)。データが入るまで停止するようにします。また、変更することもできます。

 if (Socket_Client.Avilable > 0)

if (Socket_Client.Poll(1000000, SelectMode.SelectRead))

たとえば、スレッドがアクティブでないなど、時々何かを確認する必要がある場合。

于 2013-06-25T11:54:19.067 に答える