1С и Winsock. Очень нужна помощь

1. Evgeniy 102 18.05.17 09:34 Сейчас в теме
Имеется обработка, которая работает с 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
Обработку прикрепил.
Кто подскажет как победить этот глюк.
Прикрепленные файлы:
е_ОтправкаСообщенийНаКамеруЧерезWinSocket.epf
+
Вознаграждение за ответ
Показать полностью
Найденные решения
4. caponid 18.05.17 09:53 Сейчас в теме +5 $m
Лучше подключить обработчик ожидания

WinSocket.Connect();
ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1)


Процедура ОправитьДанныеПриСоединении()
	Если WinSocket = Неопределено Тогда 
		ВызватьИсключение;
	ИначеЕсли WinSocket.State = 6 Тогда 
		Возврат 
	Иначе
		ОтключитьОбработчикОжидания("ОправитьДанныеПриСоединении");
		Если WinSocket.State = 7 Тогда
			WinSocket.SendData(ТекстСообщения);
		Иначе
			Сообщить(WinSocket.State);
		КонецЕсли; 
	КонецЕсли;
КонецПроцедуры
Показать
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. BackinSoda 18.05.17 09:38 Сейчас в теме
Пока WinSocket .State = 6 Цикл
 ОбработкаПрерыванияПользователя();
КонецЦикла;    
    
Если WinSocket .State = 7 Тогда 
 WinSocket.SendData(ТекстСообщения); 
КонецЕсли;

так пойдёт интересно ?)
+
5. Evgeniy 102 18.05.17 10:02 Сейчас в теме
(2)
Пока WinSocket .State = 6 Цикл ОбработкаПрерыванияПользователя(); КонецЦикла;


Нет, не прокатывает. Попадает в бесконечный цикл.
Я такие варианты уже пробывал.
+
3. Scop 61 18.05.17 09:51 Сейчас в теме
Попробуй в отладчике отловить момент, когда меняется 6 на 7 в случае с двумя кнопками и копай оттуда.
+
6. Evgeniy 102 18.05.17 10:06 Сейчас в теме
(3) первым делом в отладчике искал
при нажатии первой кнопке статус выставляется = 6
а при нажатии второй кнопки он уже равен 7
код обработки довольно простой и почему и как изменяется статус с 6 на 7 понять я не смог
+
4. caponid 18.05.17 09:53 Сейчас в теме +5 $m
Лучше подключить обработчик ожидания

WinSocket.Connect();
ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1)


Процедура ОправитьДанныеПриСоединении()
	Если WinSocket = Неопределено Тогда 
		ВызватьИсключение;
	ИначеЕсли WinSocket.State = 6 Тогда 
		Возврат 
	Иначе
		ОтключитьОбработчикОжидания("ОправитьДанныеПриСоединении");
		Если WinSocket.State = 7 Тогда
			WinSocket.SendData(ТекстСообщения);
		Иначе
			Сообщить(WinSocket.State);
		КонецЕсли; 
	КонецЕсли;
КонецПроцедуры
Показать
+
10. Evgeniy 102 18.05.17 10:35 Сейчас в теме
(4) а вот это вариант кажись отработал, правда происходит зацикливание, постоянно выполняет отправку сообщения (WinSocket.SendData(ТекстСообщения))
+
12. caponid 18.05.17 10:53 Сейчас в теме
(10) значит WinSocket.State выполняется больше секунды - попробовать выставить 2 сек или при входе в обработчикс разу ОтключитьОбработчикОжидания и потом стартовать в условиях
+
13. Evgeniy 102 18.05.17 11:03 Сейчас в теме
(12) время выставлял 2 секунды, так же происходит зацикливание
ОтключитьОбработчикОжидания установил перед условиями, не помогло.
По прежнему идет зацикливание.
+
11. mickey.1cx 400 18.05.17 10:40 Сейчас в теме
После команды соединения с winsocket управление должно быть передано ОС, чтобы произвести соединение.
На примере с VBA в цикле проверки статуса выполняется команда DoEvents. В 1С для этого можно использовать обработчики ожидания, как подсказали в (4)
+
7. caponid 18.05.17 10:11 Сейчас в теме
это же ком объект, и он живет по своим неторопливым правилам... возможно если в цикле проверять постоянно статус, то он не успеет выполнить соединение (все ресурсы потрачены на возврат статуса) - поэтому и предлагаю обработку ожидания.
+
8. Scop 61 18.05.17 10:21 Сейчас в теме
Так тоже не работает?
КнопкаВыполнитьНажатие(Неопределено);
ОсновныеДействияФормыОтправить(Неопределено);
+
9. Evgeniy 102 18.05.17 10:33 Сейчас в теме
(8)
КнопкаВыполнитьНажатие(Неопределено); ОсновныеДействияФормыОтправить(Неопределено);


Так тоже не отрабатывает, статус по прежнему равен 6
+
14. caponid 18.05.17 11:16 Сейчас в теме
А вот так?

ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1, Истина)


Процедура ОправитьДанныеПриСоединении()
    ОтключитьОбработчикОжидания("ОправитьДанныеПриСоединении");
    Если WinSocket = Неопределено Тогда ВызватьИсключение; КонецЕсли;
    State = WinSocket.State;
    Если State = 6 Тогда 
        ПодключитьОбработчикОжидания("ОправитьДанныеПриСоединении", 1, Истина)
    ИначеЕсли State = 7 Тогда 
        WinSocket.SendData(ТекстСообщения);
    Иначе
        Сообщить(State);
    КонецЕсли; 
КонецПроцедуры
Показать
+
15. Evgeniy 102 18.05.17 11:32 Сейчас в теме
(14)
ОтключитьОбработчикОжидания("ОправитьДанныеПриСоединении");

все разобрался с зацикливанием.
огромное спасибо за помощь, а то голову сломал пытаясь понять данную проблему.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот