0
votes

I'm trying to run the timer tick event which initially runs on my windows form,also when loaded on another class using a thread. I tried calling the timer event on another thread it didn't help. Am I supposed to use the same timer or create a new timer for that thread. This is my current implementation:

namespace XT_3_Sample_Application
{
      public partial class Form1 : Form
      {

       Queue<string> receivedDataList = new Queue<string>();



       System.Timers.Timer tmrTcpPolling = new System.Timers.Timer(); 

       public Form1()
       {
        InitializeComponent();
        TM702_G2_Connection_Initialization();

         }

         static void threadcal()
         {
        Class1 c = new Class1();
        c.timer_start();
        c.test("192.168.1.188",9999);

        }


       public string Connection_Connect(string TCP_IP_Address, int TCP_Port_Number)
          {

                if (tcpClient.Connected)
                {
                    Socket_Client = tcpClient.Client;
                    TcpStreamReader_Client = new StreamReader(tcpClient.GetStream(), Encoding.ASCII);
                    tmrTcpPolling.Start();
                    Status = "Connected\r\n";
                }
                else
                {
                    Status = "Cannot Connect\r\n";
                }



        }

       public string Connection_Disconnect()
       {
           tmrTcpPolling.Stop();

          // do something

          return "Disconnected\r\n";
      }

     void TM702_G2_Connection_Initialization()
    {
        tmrTcpPolling.Interval = 1;
        tmrTcpPolling.Elapsed += new ElapsedEventHandler(tmrTcpPolling_Elapsed);
    } 


    #region Timer Event
    void tmrTcpPolling_Elapsed(object sender, ElapsedEventArgs e)
    {
        try
        {
            if (tcpClient.Available > 0)
            {

                receivedDataList.Enqueue(TcpStreamReader_Client.ReadLine());
            }
        }
        catch (Exception)
        {

            //throw;
        }
    }

    private void tmrDisplay_Tick(object sender, EventArgs e)
    {
        Tick();
    }

    public void Tick()
    {
        Console.Write("tick" + Environment.NewLine);
        if (receivedDataList.Count > 0)
        {
            string RAW_Str = receivedDataList.Dequeue();
            //tbxConsoleOutput.AppendText(RAW_Str + Environment.NewLine);
            tbxConsoleOutput.AppendText(Parser_Selection(RAW_Str) + Environment.NewLine);
        }

    }

    #endregion

    private void btnConnect_Click(object sender, EventArgs e)
    {
        tbxConsoleOutput.AppendText(Connection_Connect(tbxTCPIP.Text, Convert.ToInt32(tbxPort.Text, 10)));
        Thread t = new Thread(threadcal);
        t.Start(); 
    }



   }
}

But the timer tick event starts the moment the application is launched but not on button click - private void btnConnect_Click(object sender, EventArgs e). I'm trying to call a separate thread for the class Class1's test method. I'm trying to use a similar timer event to receive output from the server, for this thread.

 namespace XT_3_Sample_Application
 {
   class Class1
   {

    TcpClient tcpClient;
    Socket Socket_Client;
    StreamReader TcpStreamReader_Client;    // Read in ASCII
    Queue<string> receivedDataList = new Queue<string>();
    System.Timers.Timer tmrTcpPolling = new System.Timers.Timer();



    void TM702_G2_Connection_Initialization()
    {
        tmrTcpPolling.Interval = 1;
        tmrTcpPolling.Elapsed += new ElapsedEventHandler(tmrTcpPolling_Elapsed);
    } 
    public void test(string TCP_IP_Address, int TCP_Port_Number)
    {
        TM702_G2_Connection_Initialization();


        try
        {
            string Status = "";
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();




            PingReply reply = pingSender.Send(TCP_IP_Address, timeout, buffer, options);

            if (reply.Status == IPStatus.Success)
            {
                tcpClient = new TcpClient();
                tcpClient.Connect(TCP_IP_Address, TCP_Port_Number);

                if (tcpClient.Connected)
                {
                    Socket_Client = tcpClient.Client;
                    TcpStreamReader_Client = new StreamReader(tcpClient.GetStream(), Encoding.ASCII);
                    tmrTcpPolling.Start();
                    Status = "Connected\r\n";
                }
                else
                {
                    Status = "Cannot Connect\r\n";
                }
            }
            else
            {
                Status = "Ping Fail\r\n";
            }

            MessageBox.Show(TCP_IP_Address + " :" + Status);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(TCP_IP_Address + " :" +  ex.Message);
        }


        setFilterType();

        setButtonRadioLvl();
        heloCmd();



    }
    public void timer_Start()
    {
    Form1 f = new Form1();
    f.Tick();
    }
   }
}

When tried the above method the timer is not fired on the new thread. Any suggestions on this?

1
unless you wrap the content of threadcall() in some type of loop your thread will terminate after executing the threadcall(). do you have to use timer ?Danny D
Yup the timer should be able to read the reply from the server. private void tmrDisplay_Tick(object sender, EventArgs e) method helps with this. Should I have to use the instance of the Form1 class or create a new instance?DesperateLearner
Another thought for you: it looks like you are only processing data when the timer fires - either by it's own timer or if you get the button press working. You could instead receive data in a listener and raise an event when data is received. If you would like more info on this i'll postandrew

1 Answers

0
votes

Without any blocking code or loop your thread will not live long. the following calls your test method every one second and doesn't use timer

    static void threadcal()
    {
        while (true)
        {
            Thread.Sleep(1000);
            Class1 c = new Class1();
            c.test("192.168.1.188", 9999);
        }
    }