Всем привет!
Работаю сейчас над взаимодействием двух программ по DDE, т.е. сервер как таковой уже есть, пишу клиента который опрашивает некоторое устройство и по DDE передаёт значения серверу! И столкнулся с такой проблемой: если передавать значения например по таймеру или по кнопке, то всё ок... ну а если передавать в потоке, то значения не летят...
Так работает:
private void Timer_Update_Tick(object sender, EventArgs e)
{
To_Server.SendToEms9(l);
// ThreadProc(); // если например убрать предыдущую строку а эту раз комментировать, то так тоже будет работать
}
Все функции одного класса, не могу понять в чём разница — из потока я отрабатываю функцию, или по кнопке...
Возможно, что-то связано с работой потоков? Кто сталкивался, разъясните ни сведущему!
Visual Studio 2013, C#
Здравствуйте, ronik, Вы писали:
R>Всем привет! R>Работаю сейчас над взаимодействием двух программ по DDE, т.е. сервер как таковой уже есть, пишу клиента который опрашивает некоторое устройство и по DDE передаёт значения серверу! И столкнулся с такой проблемой: если передавать значения например по таймеру или по кнопке, то всё ок... ну а если передавать в потоке, то значения не летят...
... R>Все функции одного класса, не могу понять в чём разница — из потока я отрабатываю функцию, или по кнопке... R>Возможно, что-то связано с работой потоков? Кто сталкивался, разъясните ни сведущему! R>Visual Studio 2013, C#
Разница, вероятно, в том, как работает DDE. Вообще, если есть выбор, я бы DDE не использовал, не очень надёжная это вещь.
DDE использует сообщения Windows, которые рассылаются окнам. Соответственно, в потоке-передатчике, чтобы получить ответ, должно быть окно и цикл обработки оконных сообщений.
В главном треде, оно, очевидно, есть. В только что созданном — нет.
R>>Все функции одного класса, не могу понять в чём разница — из потока я отрабатываю функцию, или по кнопке... R>>Возможно, что-то связано с работой потоков? Кто сталкивался, разъясните ни сведущему! R>>Visual Studio 2013, C# V>Разница, вероятно, в том, как работает DDE. Вообще, если есть выбор, я бы DDE не использовал, не очень надёжная это вещь. V>DDE использует сообщения Windows, которые рассылаются окнам. Соответственно, в потоке-передатчике, чтобы получить ответ, должно быть окно и цикл обработки оконных сообщений. V>В главном треде, оно, очевидно, есть. В только что созданном — нет.
И снова здрасте!
Ну что, по рылся, по мучался и кое-что необычное для себя обнаружил... И так, испытания проводились с помощью двух конфигураций:
1. Windows 8.1 + VS 2013 Up5
2. Windows 7 SP1 + VS 2015
Проекты WinForms создавал как нормальный чел. с использованием новейшего framework'а (4.5.1), чем собственно говоря и поплатился... Обмен по DDE не работает ни с одним framework кроме 3.5, но и тут ещё не всё... Нужно сказать, что совершенно случайно обнаружил особенность... Т.е. если запускать программу из студии — обмена не будет, ну а если запустить исполняемый файл программы из проводника — всё ок! Чем это можно объяснить не знаю!
Да вот ещё, только, что нашёл, если снять галочку в свойствах проекта на "Включить ведущий процесс Visual Studio" — то из студии тоже работает!!!
Здравствуйте, ronik, Вы писали:
R>И снова здрасте!
Кэп:
1. Использовать DDE в 2015 году — это или изощрённое эстетство или некрофилия. Чем вам WCF и ко не подходят?
2. "не работает ни с одним framework кроме 3.5" — вы что-то делаете не так. Из кандидатов — разрядность процесса, разные уровни изоляции, запуск под отладкой с настройками по умолчанию (в свежих студиях оно емнип поломано каким-то странным образом), ошибки в interop-коде, ошибки в используемых библиотеках итд. В любом из вариантов жаловаться "оно поломалось" — неправильный подход к решению проблемы
3. Блин, оно же умерло и воняло ещё в прошлом веке. Зачем?
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, ronik, Вы писали:
R>>И снова здрасте!
S>Кэп: S>1. Использовать DDE в 2015 году — это или изощрённое эстетство или некрофилия. Чем вам WCF и ко не подходят?
S>2. "не работает ни с одним framework кроме 3.5" — вы что-то делаете не так. Из кандидатов — разрядность процесса, разные уровни изоляции, запуск под отладкой с настройками по умолчанию (в свежих студиях оно емнип поломано каким-то странным образом), ошибки в interop-коде, ошибки в используемых библиотеках итд. В любом из вариантов жаловаться "оно поломалось" — неправильный подход к решению проблемы
S>3. Блин, оно же умерло и воняло ещё в прошлом веке. Зачем?
1,3. Ну на самом деле без вариантов, есть уже существующий сервер к которому необходимо привязаться по DDE...
2. Не много оскорбило — "жаловаться", я ни в коем случае не жалуюсь — боже упаси... Решение проблемы, как в том фильме: "Будем искать..."
P.S. Хотя нужно сказать есть ещё вариант, написать OPC клиента... Но на сколько знаю, тема не простая!
Здравствуйте, Sinix, Вы писали:
S>Кэп: S>1. Использовать DDE в 2015 году — это или изощрённое эстетство или некрофилия. Чем вам WCF и ко не подходят?
Ну предложите другой способ более-менее унифицированным образом получать котировки с eSignal, NetInvestor, MT4 и целый ряд других терминалов могу назвать.
Здравствуйте, romangr, Вы писали:
R>Ну предложите другой способ более-менее унифицированным образом получать котировки с eSignal, NetInvestor, MT4 и целый ряд других терминалов могу назвать.
Безусловно. Мы даже сравнивали по исигналу, что там по DDE, а что по API.
В общем, DDE — это технология устаревшая, тем не менее, используется и в хвост и в гриву.
NDDE помогает.
Здравствуйте, ronik, Вы писали:
R>>>если запускать программу из студии — обмена не будет, ну а если запустить исполняемый файл программы из проводника — всё ок! R>>>Чем это можно объяснить не знаю!
Скорее всего, из-за UAC (точнее говоря, из-за UIPI). Подробнее здесь:
Да спасибо, вероятно, но я выше писал, что снимая галочку в свойствах проекта "Включить ведущий процесс Visual Studio" — всё отлично работает! И нужно сказать, что с Framework 4.0 то же идёт обмен... O>Скорее всего, из-за UAC (точнее говоря, из-за UIPI). Подробнее здесь:
O>Windows Integrity Mechanism Design O>https://msdn.microsoft.com/en-us/library/bb625963.aspx