WWW::Curl::Easy и многопоточность., mthawk, 25-Апр-09, 23:34 [смотреть все]Здравствуйте! Пишу на perl многопоточный демон, который управляет через COM несколькими устройствами и докладывает об этом по сети на удаленный сервер. Использую по триду на устройство и трид, который держит связь через WWW::Curl::Easy. Основная программа держит связь с тридами через Unix Socket, координирует их работу, формирует и передает данные для отправки в "сетевой" трид. Проблема: До тех пор, пока связь есть - все хорошо. Но когда возникают проблемы с сетью при неуспешной отправке сетевого запроса все падает с сообщением на консоль: Usage: WWW::Curl::Easy::strerror(self, errornum) at /tmp/daemon line 18. Могу только догадаться, что это реакция на строку: print nowdate()." NET: Receiving data... Socket error occupied ".$XMLSOCK->strerror($retcode)." ($retcode).\n" потому что line 18 - это usleep внутри while(1){...} основной программы, не трида. Переменная, которая должна содержать код ошибки при отправке данных через WWW::Curl::Easy содержит вместо этого указатель на скаряр WWW::Curl::Easy=SCALAR(0xa958814) Если WWW::Curl::Easy используется в основной программе, а не триде этой проблемы нет. Но это недопустимо для меня. Кто может прояснить в чем проблема и с каким нюансом работы модулей и тридов я столкнулся. Заранее благодарю! |
- WWW::Curl::Easy и многопоточность., NuINu, 17:40 , 27-Апр-09 (1)
>[оверквотинг удален] >потому что line 18 - это usleep внутри while(1){...} основной программы, не >трида. >Переменная, которая должна содержать код ошибки при отправке данных через WWW::Curl::Easy содержит >вместо этого указатель на скаряр WWW::Curl::Easy=SCALAR(0xa958814) >Если WWW::Curl::Easy используется в основной программе, а не триде этой проблемы нет. >Но это недопустимо для меня. > >Кто может прояснить в чем проблема и с каким нюансом работы модулей >и тридов я столкнулся. >Заранее благодарю! попробуйте проверять defined $XMLSOCK перед вызовом метода. скорее всего его уже нет. потому и ругается.
- WWW::Curl::Easy и многопоточность., mthawk, 18:04 , 27-Апр-09 (2)
>попробуйте проверять defined $XMLSOCK перед вызовом метода. >скорее всего его уже нет. потому и ругается. Спасибо за проявленное внимание! $XMLSOCK объявлена и имеет значение (WWW::Curl::Easy=SCALAR(0xa958814) ) - указатель на скаляр. Судя по форме значения складывается ощущение, что скрипт теряет импортированное из модуля WWW::Curl::Easy пространство имен функций и переменных. Проблема актуальна!
- WWW::Curl::Easy и многопоточность., NuINu, 09:53 , 28-Апр-09 (3)
>>попробуйте проверять defined $XMLSOCK перед вызовом метода. >>скорее всего его уже нет. потому и ругается. > >Спасибо за проявленное внимание! >$XMLSOCK объявлена и имеет значение (WWW::Curl::Easy=SCALAR(0xa958814) ) - указатель на скаляр. >Судя по форме значения складывается ощущение, что скрипт теряет импортированное из модуля >WWW::Curl::Easy пространство имен функций и переменных. >Проблема актуальна! не думаю что так. переменная $XMLSOCK должна выглядеть как объект Dump curl: $VAR1 = bless( do{\(my $o = 135701648)}, 'WWW::Curl::Easy' ); вы же методу передаете скаляр. естественно функция которая вызывается видит это и ругается: Usage: WWW::Curl::Easy::strerror(self, errornum) значит либо кто то переопределил эту перемнную $XMLSOCK либо в не правильно передаете значение объекта в трид.
|