1С и Winsock. Очень нужна помощь
Имеется обработка, которая работает с Winsock
В обработке 2 кнопки.
Первая кнопка создает подключение
WinSocket = Новый COMОбъект("MSWinsock.Winsock");
WinSocket.RemoteHost = Адрес;
WinSocket.RemotePort = Порт;
WinSocket.Connect();
Вторая кнопка отправляет сообщение
Если WinSocket <> Неопределено И WinSocket.State = 7 Тогда
WinSocket.SendData(ТекстСообщения);
КонецЕсли;
И данный механизм прекрасно работает когда по очереди нажимаешь 2 кнопки, но потребовалось объединить этот код в одну процедуру (создал одну кнопку в которую добавил необходимые процедуры) и нечего не получается.
Проблема как выяснилось в том что реквизит State всегда равен 6 (состояние соединение)
А нужно чтобы он перешел в значение 7
Подключал таймаут, для того чтобы соединение подключилось, но не помогло.
1С платформа 8.3
Обработку прикрепил.
Кто подскажет как победить этот глюк.
В обработке 2 кнопки.
Первая кнопка создает подключение
WinSocket = Новый COMОбъект("MSWinsock.Winsock");
WinSocket.RemoteHost = Адрес;
WinSocket.RemotePort = Порт;
WinSocket.Connect();
Вторая кнопка отправляет сообщение
Если WinSocket <> Неопределено И WinSocket.State = 7 Тогда
WinSocket.SendData(ТекстСообщения);
КонецЕсли;
И данный механизм прекрасно работает когда по очереди нажимаешь 2 кнопки, но потребовалось объединить этот код в одну процедуру (создал одну кнопку в которую добавил необходимые процедуры) и нечего не получается.
Проблема как выяснилось в том что реквизит State всегда равен 6 (состояние соединение)
А нужно чтобы он перешел в значение 7
Подключал таймаут, для того чтобы соединение подключилось, но не помогло.
1С платформа 8.3
Обработку прикрепил.
Кто подскажет как победить этот глюк.
Прикрепленные файлы:
е_ОтправкаСообщенийНаКамеруЧерезWinSocket.epf
Найденные решения
Лучше подключить обработчик ожидания
WinSocket.Connect();
ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1)
Процедура ОправитьДанныеПриСоединении()
Если WinSocket = Неопределено Тогда
ВызватьИсключение;
ИначеЕсли WinSocket.State = 6 Тогда
Возврат
Иначе
ОтключитьОбработчикОжидания("ОправитьДанныеПриСоединении");
Если WinSocket.State = 7 Тогда
WinSocket.SendData(ТекстСообщения);
Иначе
Сообщить(WinSocket.State);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Пока WinSocket .State = 6 Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
Если WinSocket .State = 7 Тогда
WinSocket.SendData(ТекстСообщения);
КонецЕсли;
так пойдёт интересно ?)
Попробуй в отладчике отловить момент, когда меняется 6 на 7 в случае с двумя кнопками и копай оттуда.
Лучше подключить обработчик ожидания
WinSocket.Connect();
ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1)
Процедура ОправитьДанныеПриСоединении()
Если WinSocket = Неопределено Тогда
ВызватьИсключение;
ИначеЕсли WinSocket.State = 6 Тогда
Возврат
Иначе
ОтключитьОбработчикОжидания("ОправитьДанныеПриСоединении");
Если WinSocket.State = 7 Тогда
WinSocket.SendData(ТекстСообщения);
Иначе
Сообщить(WinSocket.State);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
это же ком объект, и он живет по своим неторопливым правилам... возможно если в цикле проверять постоянно статус, то он не успеет выполнить соединение (все ресурсы потрачены на возврат статуса) - поэтому и предлагаю обработку ожидания.
Так тоже не работает?
КнопкаВыполнитьНажатие(Неопределено);
ОсновныеДействияФормыОтправить(Неопределено);
А вот так?
ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1, Истина)
ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1, Истина)
Процедура ОправитьДанныеПриСоединении()
ОтключитьОбработчикОжидания("ОправитьДанныеПриСоединении");
Если WinSocket = Неопределено Тогда ВызватьИсключение; КонецЕсли;
State = WinSocket.State;
Если State = 6 Тогда
ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1, Истина)
ИначеЕсли State = 7 Тогда
WinSocket.SendData(ТекстСообщения);
Иначе
Сообщить(State);
КонецЕсли;
КонецПроцедуры
Показать
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот