Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2015, 09:49   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию C# Перенос программы из консоли в WF

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace NEWSERV
{



    public class StateObject
    {
        // Client  socket.
        public Socket workSocket = null;
        // Size of receive buffer.
        public const int BufferSize = 2048;

        public byte[] buffer = new byte[BufferSize];
  
        public StringBuilder sb = new StringBuilder();
    }

    public class AsynchronousSocketListener
    {
        // Thread signal.
        public static ManualResetEvent allDone = new ManualResetEvent(false);

        public AsynchronousSocketListener()
        {
        }

        public static void StartListening()
        {
            // Data buffer for incoming data.
            byte[] bytes = new Byte[2048];

            // Establish the local endpoint for the socket.
            // The DNS name of the computer
            // running the listener is "host.contoso.com".
            IPHostEntry ipHostInfo = Dns.Resolve("localhost");//Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);


            Socket listener = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);

          
            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(100);

                while (true)
                {

                    allDone.Reset();

                    Console.WriteLine("Waiting for a connection...");
                    listener.BeginAccept(
                        new AsyncCallback(AcceptCallback),
                        listener);

 
                    allDone.WaitOne();
                }

            }
        

            Console.WriteLine("\nPress ENTER to continue...");
            Console.Read();

        }

        public static void AcceptCallback(IAsyncResult ar)
        {
            // Signal the main thread to continue.
            allDone.Set();

            // Get the socket that handles the client request.
            Socket listener = (Socket)ar.AsyncState;
            Socket handler = listener.EndAccept(ar);

            // Create the state object.
            StateObject state = new StateObject();
            state.workSocket = handler;
            handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
        }

        public static void ReadCallback(IAsyncResult ar)
        {
            String content = String.Empty;


            StateObject state = (StateObject)ar.AsyncState;
            Socket handler = state.workSocket;

            int bytesRead = handler.EndReceive(ar);

            if (bytesRead > 0)
            {

                state.sb.Append(Encoding.ASCII.GetString(
                    state.buffer, 0, bytesRead));

                content = state.sb.ToString();
                if (content.IndexOf("<EOF>") > -1)
                {
                    // All the data has been read from the 
                    // client. Display it on the console.
                    Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
                        content.Length, content);
                    // Echo the data back to the client.
                    Send(handler, content);
                }
                else
                {
                    // Not all data received. Get more.
                    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReadCallback), state);
                }
            }
        }

        private static void Send(Socket handler, String data)
        {
            // Convert the string data to byte data using ASCII encoding.
            byte[] byteData = Encoding.ASCII.GetBytes(data);


            handler.BeginSend(byteData, 0, byteData.Length, 0,
                new AsyncCallback(SendCallback), handler);
        }

        private static void SendCallback(IAsyncResult ar)
        {
            try
            {

                Socket handler = (Socket)ar.AsyncState;


                int bytesSent = handler.EndSend(ar);
                Console.WriteLine("Sent {0} bytes to client.", bytesSent);

                handler.Shutdown(SocketShutdown.Both);
                handler.Close();

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }


        public static int Main(String[] args)
        {
            StartListening();
            return 0;
        }
    }
}
Krasi вне форума Ответить с цитированием
Старый 02.11.2015, 09:50   #2
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Если я хочу перенести этот проект в Windows Forms, я же не могу просто скопипастить и все? Какие функции придется заменить, какими, как лучше вообще переносить, классами?
Krasi вне форума Ответить с цитированием
Старый 02.11.2015, 10:10   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну для начала ты просто попробуй перенести методы так как они написаны, а потом делать замену исходя из текстов ошибок.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2015, 10:19   #4
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ок, начало есть.
Прилагаю целый проект сервера. Консольное приложение отлично принимало данные с клиента. То есть запустил сервер, запустил клиент - и пошло, дело было отлажено.
Теперь, сначала, я нажимаю на баттон в программе-сервере. Начинается запуск сервера.

1. Сервер я уже кнопкой остановить не могу, почему?
2. У label1 должен поменяться текст, но почему это может не происходить?

При всем при этом, клиент пока не может работать без сервера, а я ради интереса запустил клиент - он отлично работал при запущенном сервере. То есть, видимо, что-то в сервере работает, но вот вышестоящие два вопроса я хотел бы исправить для начала.

Причем, я даже понимаю, что это может происходить из-за вечного цикла в классе сервера
Код:
try
            {
                listener.Bind(localEndPoint);
                listener.Listen(100);

                while (true)
                {
                    // Set the event to nonsignaled state.
                    allDone.Reset();

                    // Start an asynchronous socket to listen for connections.
                    //Console.WriteLine("Waiting for a connection...");
                    Form1.IQdata = "Waiting for a connections";
                    listener.BeginAccept(
                        new AsyncCallback(AcceptCallback),
                        listener);

                    // Wait until a connection is made before continuing.
                    allDone.WaitOne();
                }

            }
Но что с этим можно сделать-то?
Вложения
Тип файла: zip Receiver.zip (57.2 Кб, 11 просмотров)

Последний раз редактировалось Stilet; 02.11.2015 в 14:56.
Krasi вне форума Ответить с цитированием
Старый 02.11.2015, 14:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Сервер я уже кнопкой остановить не могу, почему?
Ну скорее всего потому, что он у тебя блокирует главный поток.
Тебе его нужно засунуть в дополнительный поток, тогда получится им управлять.
Цитата:
У label1 должен поменяться текст, но почему это может не происходить?
Что это за обработчик?
Цитата:
void tmr_Tick(object sender, EventArgs e)
{
AsynchronousSocketListener.StartLis tening();
label1.Text = IQdata;
/////////////////////////////Счетчик и его обнуление с очисткой массивов///////////////////////////
itmr = itmr + 1;
}
Это таймер?
I'm learning to live...

Последний раз редактировалось Stilet; 02.11.2015 в 15:00.
Stilet вне форума Ответить с цитированием
Старый 02.11.2015, 16:31   #6
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Да, таймер. Мне надо каждые 500 мс, например, брать новый массив из исходных данных и обрабатывать их.
Krasi вне форума Ответить с цитированием
Старый 02.11.2015, 16:50   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Нет. Так не пойдет. Таймер убирай. Создавай доппоток, в него цикл где происходит прослушивание. Из прослушки вызывай события по делегатам. Таймер тут только мешает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2015, 17:10   #8
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Это как вообще? Просто изначально-то у меня был таймер, потому что есть куча бесконечных данных, например, с картинки 4 МБ. А обрабатывать за цикл таймера мне надо только 1800 бит. Я бы убрал таймер, но тогда я вообще не понимал, как это возможно.

И только сейчас мне понадобилось передавать уже результаты работы программы на сервер. Логично, я подумал - надо в клиенте по этому же таймеру вызывать клиент, чтобы он передавал данные.

Теперь наступила пора сервера - а в сервере будет аналогичная обработка. То есть мне надо делать кучу циклов, в каждом из которых обрабатывается лишь 1800 бит, а в итоге получается 4> МБ информации. И вот поэтому у меня тут вопрос, как это сделать без таймера? Что за доппоток?
Krasi вне форума Ответить с цитированием
Старый 02.11.2015, 17:17   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ох... Слюш, ты не с того начал...
Начни отсюда:
http://www.programmersforum.ru/showthread.php?t=78513
http://www.programmersforum.ru/showthread.php?t=142618
http://www.programmersforum.ru/showthread.php?t=256310

Тебе сейчас рано писать сетевое ПО. Вот освоишь потоки, тогда можно будет и прослушиватель ставить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2015, 10:18   #10
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Тогда прошу помочь по потокам.
Давайте начнем с клиента, все-таки. Вот у меня первый вопрос - я без таймера не смогу ограничить скорость работы программы? Или смогу?
Вот таймер выглядит так, мне все понятно:
Код:
public partial class FormM : Form
    {
 public FormM()
        {
            InitializeComponent();
            tmr.Interval = 100;
            tmr.Tick += new EventHandler(tmr_Tick);
            button1.Text = "Start";}
void tmr_Tick(object sender, EventArgs e)
        {
            AsynchronousClient.Ipart = Iout[itmr - 1];
            AsynchronousClient.Qpart = Qout[itmr - 1];
            AsynchronousClient myClass = new AsynchronousClient();
            myClass.StartClient();
/////////////////////////////Счетчик и его обнуление///////////////////////////
                itmr = itmr + 1;
                if (itmr >= 100)
                {
                    itmr = 1;
                }
         }

 private void button1_Click(object sender, EventArgs e)
        {
            tmr.Enabled = !tmr.Enabled;
            button1.Text = tmr.Enabled ? "Стоп" : "Старт";
            button1.ForeColor = tmr.Enabled ? Color.Green : Color.DarkRed;

     
        }
    }
Здесь все понятно. Программа не выполняется, пока не нажата кнопка start. Нажали, программа тогда берет значения из массива, передает в другой класс, и таймер определяет отчеты, которые она передает. Если значения кончились, программа начинает перебирать значения массива сначала. А другой класс передает данные в эфир.

Ок, давайте уйдем от таймера. Как будет выглядеть программа, аналогичная вышеуказанной? Пробую представить:
Код:
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            tmr_Enabled = !tmr_Enabled;
            button1.Text = tmr_Enabled ? "Стоп" : "Старт";
            button1.ForeColor = tmr_Enabled ? Color.Green : Color.DarkRed;
            generate();   
        }

    public void generate()
        { 

Thread thread1 = new Thread(
                   new ThreadStart(() =>
                   {//Здесь другие алгоритмы, для получения Iout и Qout}));

Thread thread2 = new Thread(
                   new ThreadStart(() =>
                   {AsynchronousClient.Ipart = Iout[itmr - 1];
            AsynchronousClient.Qpart = Qout[itmr - 1];
            AsynchronousClient myClass = new AsynchronousClient();
            myClass.StartClient();}));

   }
Я ошибаюсь, или так и надо? Чем это лучше таймера?

И вопрос на засыпку, потому что мне пока бы так все работала, замудростей не надо, но: программа в таком виде не использует полностью многопроцессорность? Есть ли какой-то путь, чтобы по максимуму использовать возможности 8-ядерного Core i7? Или все и так используется на полную катушку? Просто я в МАТЛАБ проверял, МАТЛАБ работал с одним ядром, и то не сильно его грузил, и там я нашел некоторые функции для многопроцессорности, теперь интересно стало, есть ли в C что-то подобное?

Последний раз редактировалось Krasi; 03.11.2015 в 14:36.
Krasi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы в консоли deniscatch Общие вопросы по Java, Java SE, Kotlin 2 04.08.2014 23:38
Перенос с консоли на форму вызвал ряд ошибок / С++ diha-o C/C++ Сетевое программирование 0 29.04.2014 23:18
перенос курсора в консоли в заданную позицию Felian Qt и кроссплатформенное программирование С/С++ 1 18.12.2011 09:32
Перенос программы в HTML romanzi HTML и CSS 6 08.11.2010 22:01
Переписать 3 программы с Delphi консоли na C++ to-ot Фриланс 6 22.10.2010 02:38