Потоки, глобальные переменные и обмен данными между ними - C#
Формулировка задачи:
Имеется два потока (А и Б) которые каждую минуту генерируют число.
Также имеются две переменные (int iA, iB) и в эти переменные вышеуказанные потоки записавыют свои числа.
Как мне их объявит данный переменные iA, iB так чтобы оба потока могли сохранить в них свои значения.
Всё это надо чтобы третий поток по таймеру считывал с переменных значение и в форму выводил среднее значение.
П.С. Вопрос сформулирован расплывчато но мне надо разобраться как правильно обмениваться информацией между потоками не сползаю invoke.
Решение задачи: «Потоки, глобальные переменные и обмен данными между ними»
textual
Листинг программы
- public bool startNetServer()
- {
- try
- {
- connections = new List<Tconnection>();
- IPAddress ip = new IPAddress(new byte[] { 0, 0, 0, 0 }); // тут всё привычно - создание слушателя
- listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- ep = new IPEndPoint(ip, VikingConfig.TCPport);
- listener.Bind(ep);
- listener.Listen(1000);
- waitAccept(); // в этом методе говорю - надо слушать
- outLog("Net server start", VikingServer.logLevel.WARNING);
- return true;
- }
- catch (Exception ex)
- {
- outLog("Error of starting net server\r\n" + ex.ToString(), VikingServer.logLevel.ERROR);
- return false;
- }
- }
- void waitAccept()
- {
- try
- {
- listener.BeginAccept(acceptCallBack, listener); // асинхронный метод ожидания подключений, передаём в метод делегат и ссылку на сокет-слушатель
- }
- catch (Exception ex)
- {
- outLog(ex.ToString() + "\r\nListen is closed", VikingServer.logLevel.ERROR);
- }
- }
- void acceptCallBack(IAsyncResult ar) // новое подключение - вызывается этот метод
- {
- Tconnection newConnection;
- try
- {
- Socket s = (Socket)ar.AsyncState; // получаем сокет-слушатель
- Socket newSocket = s.EndAccept(ar); // получаем сокет нового подключения, завершая операцию ожидания подключений
- newConnection = new Tconnection(newSocket); // это мой код
- newConnection.IP = ((IPEndPoint)newSocket.RemoteEndPoint).Address.ToString();
- outLog("Found new connection from " + newConnection.IP, VikingServer.logLevel.WARNING);
- newConnection.Port = ((IPEndPoint)newSocket.RemoteEndPoint).Port;
- newConnection.ID = 0;
- newConnection.ConnectTime = DateTime.Now;
- newConnection.Status = connectionStatus.ON;
- newConnection.InDataEvent += NewConnection_InDataEvent;
- newConnection.OutDataEvent += NewConnection_OutDataEvent;
- newConnection.outLog += NewConnection_outLog;
- newConnection.TimerElapsed += NewConnection_TimerElapsed;
- if (newConnection.BeginListen()) // начинаю слушать - что же новый клиент имеет мне сказать
- WaitingList.Add(newConnection);
- waitAccept(); // не забываю опять ставить на прослушку сокет-слушатель
- }
- catch (SocketException ex)
- {
- if (ex.SocketErrorCode == SocketError.ConnectionReset)
- {
- waitAccept();
- return;
- }
- outLog(ex.ToString() + "ErrCode: " + ex.SocketErrorCode.ToString(), VikingServer.logLevel.ERROR);
- waitAccept();
- }
- catch (Exception ex)
- {
- outLog(ex.ToString(), VikingServer.logLevel.ERROR);
- waitAccept();
- }
- }
- public bool BeginListen()
- {
- try
- {
- _sock.BeginReceive(InData, 0, 1500, SocketFlags.None, ReceiveCallBack, _sock); // начинаю в пуле потоков ждать данных от нового клиента, когда данные будут получены - будет вызван делегат ReceiveCallBack
- return true;
- }
- catch (Exception ex)
- {
- if (outLog != null)
- outLog("Listen data error:\r\n" + ex.ToString(), VikingServer.logLevel.ERROR);
- return false;
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д