Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трансляция данных между программами 
:(
    Опции темы
Буратиныч
Дата 26.1.2013, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Каким образом можно передать данные (объекты структур или ссылки на них, массивы или просто переменные) из одной программы в другую? Могу предположить, что надо покопаться в теме Marshal или Socket, но не уверен, да и сходу реализовать не просто. Буду благодарен за простой пример: в одной программе что-то пишется в textblock или консоль, а в другой тут-же отображается в textbox, при этом текстовый файл в качестве посредника не используется. Так думаю легче будет понять.
PM MAIL   Вверх
kiler4747
Дата 26.1.2013, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.2.2011

Репутация: нет
Всего: нет



Используйте wcf
PM MAIL Skype   Вверх
Certain
Дата 26.1.2013, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



Как вариант Named Pipes... Хотя и в WCF такой вариант тоже реализован
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
AntiInt
Дата 27.1.2013, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 15.5.2009

Репутация: нет
Всего: нет



лучшей вариант это wfc
можно и старым-добрым remouting-ом обойтись
PM MAIL   Вверх
Буратиныч
Дата 27.1.2013, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



а если отправляющий клиент на С/С++, а принимающий сервер на С#, то что лучше?
PM MAIL   Вверх
Буратиныч
Дата 29.1.2013, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Имеет ли смысл переписать этот пример используя модификатор async?
PM MAIL   Вверх
Certain
Дата 30.1.2013, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



А смысл? Там и так всё асинхронно работает
BeginWaitForConnection не останавливает вызывающий поток.
Все методы, начинающиеся с Begin и End являются асинхронными в Framework

Это сообщение отредактировал(а) Certain - 30.1.2013, 07:10
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Буратиныч
Дата 30.1.2013, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Да я перенёс в свой WPF проект серверную часть. Дебаггер пишет, что коннект есть, но сообщения не поступают.

Также в этой части Invoke подсвечивается красным и выдаётся ошибка Cannot resolve symbol 'InvokeRequired'.
Может ему каких-то using-ов не хватает?    
  
Код

        private void PipesMessageHandler(string message)
        {
            try
            {

                //if (this.InvokeRequired)
                //{
                //    this.Invoke(new NewMessageDelegate(PipesMessageHandler), message);
                //}
                //else
                //{
                    Ptext.Text = message;
                //}
            }
            catch (Exception ex)
            {

                Debug.WriteLine(ex.Message);
            }

        }

PM MAIL   Вверх
Certain
Дата 30.1.2013, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



Может проект сюда скинете...
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Буратиныч
Дата 30.1.2013, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Certain, скинул.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  PipesServerWPF.zip 63,61 Kb
PM MAIL   Вверх
Certain
Дата 30.1.2013, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



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


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  PipesServerWPF.rar 61,19 Kb
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Буратиныч
Дата 30.1.2013, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Цитата(Certain @ 30.1.2013,  13:54)
Поправил Ваш пример.
Осталось только из полученного массива нулевые байты удалить, а так всё принимает и отправляет. Клиент там же

Спасибо. А что именно я там не доделал?

Всё-таки, если заменить эти конструкции на лябда-выражения и await/async, будет ли пример более проще и понятнее. Сейчас не очень много литературы по C# 5.0, поэтому не знаю как правильно сделать.
PM MAIL   Вверх
Certain
Дата 30.1.2013, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



А где Вы хотели использовать лямбда-выражения? И await/async?
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Буратиныч
Дата 30.1.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Цитата(Certain @ 30.1.2013,  14:17)
А где Вы хотели использовать лямбда-выражения? И await/async?

Не знаю. Пока только въезжаю в тему.

А изменения подскажите в чём заключались?

Добавлено через 7 минут и 59 секунд
А, получается принципиально другая команда должна быть?
txtForReceiving.Dispatcher.Invoke(delegate {txtForReceiving.Text = message; }); 
PM MAIL   Вверх
Certain
Дата 30.1.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



Да, напрямую обращаться к UI из другого потока нельзя.
Можно и так  smile 
Код

txtForReceiving.Dispatcher.Invoke(() => { txtForReceiving.Text = message; }); 


Добавлено через 9 минут
Хорошая статья await/async
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Буратиныч
Дата 30.1.2013, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Не могу понять почему у меня эта ошибка

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  delegat1.jpg 25,51 Kb
PM MAIL   Вверх
Certain
Дата 31.1.2013, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



Попробуйте явно указать тип делегата:
Код

txtForReceiving.Dispatcher.Invoke((Action)delegate { txtForReceiving.Text = message; });

--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Буратиныч
Дата 31.1.2013, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Цитата(Certain @  31.1.2013,  10:05 Найти цитируемый пост)
Попробуйте явно указать тип делегата:


Спасибо!  smile 
PM MAIL   Вверх
Буратиныч
Дата 7.2.2013, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Подскажите, как передать объект по трубе? Я делаю через сериализацию, но у меня вылетает исключение "Канал нарушен".

Код

NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", pipeName, PipeDirection.Out);
var binobj = new BinaryStream(pipeName, sendStr, val);
BinaryFormatter binFormat = new BinaryFormatter();
 pipeStream.Connect(_timeout);
binFormat.Serialize(pipeStream, binobj);
pipeStream.Flush();
pipeStream.Close();


Это сообщение отредактировал(а) Буратиныч - 8.2.2013, 11:36
PM MAIL   Вверх
Буратиныч
Дата 10.2.2013, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Всё, я окончательно себе мозг вынес. Ну как этот объект передать через NamedPipe?!! И не вынося себе мозг с изучением WCF.
PM MAIL   Вверх
Certain
Дата 15.2.2013, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



Цитата

но у меня вылетает исключение "Канал нарушен"


На какой строке именно?

Исходник выложи, проще будет
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Буратиныч
Дата 15.2.2013, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 15.3.2011

Репутация: нет
Всего: нет



Цитата(Certain @ 15.2.2013,  21:20)
Цитата

но у меня вылетает исключение "Канал нарушен"


На какой строке именно?

Исходник выложи, проще будет

Проблема на стороне клиента. В коде всё в куче, пытался делать разными способами, что не получалось коментил. Так и остановился на передачи стрингов. Наверное, лучше будет показать передачу объектов класса на базе того примера, который указан выше.

Код

        public string BinOut(string pipeName, string sendStr, float val, float timeOut = 0)
        {

            string result = "Wait for Connection";
            using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", pipeName, PipeDirection.Out))
            {
                try
                {
                    var binobj = new BinaryStream(pipeName, sendStr, val);
                    //BinaryFormatter binFormat = new BinaryFormatter();
                    SoapFormatter binFormat = new SoapFormatter();
                    MemoryStream stream = new MemoryStream();
                    binFormat.Serialize(stream, binobj);
                    byte[] buffer = GetStreamBytes(stream);
                    //byte[] buffer = Encoding.UTF8.GetBytes(stream.ToString());

                    string s = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

                    int _timeout = (int)timeOut;
                    pipeStream.Connect(_timeout);
                    result = pipeStream.IsConnected ? "Connected!" : "Not Connected";
                    pipeStream.Write(buffer, 0, buffer.Length);

                    //stream.WriteTo(new FileStream("C:\\info3.txt", FileMode.Create, FileAccess.Write, FileShare.None));
                    pipeStream.Flush();
                    pipeStream.Close();

                    //result = pipeStream.IsMessageComplete ? "Message Sent!" : "Not Sent";

                    //pipeStream.Write(binFormat.Serialize(pipeStream,binobj));

                    //Debug.WriteLine("[Client] Try to connect {0} & send message: {1}", pipeName, sendStr);

                    

                    //binFormat.Serialize(pipeStream, binobj);

                    //byte[] _buffer;
                    //MemoryStream memStream = new MemoryStream();
                    
                    //binFormat.Serialize(memStream,binobj);
                    //byte[] _buffer = Encoding.UTF8.GetBytes(memStream.ToString());

                    //pipeStream.Write(_buffer, 0, _buffer.Length);
                    //pipeStream.Flush();
                    //pipeStream.Close();
                    //pipeStream.Dispose();

                    //using (StreamWriter sw = new StreamWriter(pipeStream))
                    //{
                    //    binFormat.Serialize(sw, binobj);
                    //}

                    //SoapFormatter soapFormatter = new SoapFormatter();
                    //MemoryStream soapmem = new MemoryStream();
                    //soapFormatter.Serialize(soapmem, binobj);
                    ////string smsg = Convert.ToString(soapmem);
                    //byte[] buffer = Encoding.UTF8.GetBytes(Convert.ToString(soapmem));
                    
                    ////binFormat.Deserialize(memStream);

                    //string s = (string)soapFormatter.Deserialize(soapmem);
                    //byte bb;
                    //soapmem.ReadByte();
                }
                catch (TimeoutException oEX)
                {
                    Debug.WriteLine(oEX.Message);
                }
            }
            return result;
        }

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.