Вверх ↑
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
#1: 2013-03-15 02:10:10 ЛС | профиль | цитата
Обнаружил глюк TCP клиента, не могу понять с чем связано, схема элементарная, помогите выявить причину глюка, 3й день не могу решить:
code_30580.txt

Откройте схему, нажмите кнопку 1, затем кнопку 2. в Memo ни чего не появляется.
Если схему запустить заново и нажать сначала 2 а потом 1 , то в Memo отображается инфа.
Сразу объясню почему использую WinExec - он может работать асинхронно, что в случае с ping'ом сервера очень удобно (если проблемы со связью), программа в данном случае не "подвисает" как если использовать компонент ping,да и отдельный поток создавать не надо.
+ сейчас схема тестовая, в дальнейшем действия будут выполняться на основе результата пинга (в учет пойдет кол-во % потерь).

Проверял на 3х разных web серверах, на разных php обработчиках. Везде была аналогичная ситуация. Так же пробовал компилировать схему на 2х разных компах (Win7 32& Win7 64).


карма: 0

0
файлы: 1code_30580.txt [1.4KB] [219]
Ответов: 16884
Рейтинг: 1239
#2: 2013-03-15 09:22:36 ЛС | профиль | цитата
Gunnman писал(а):
Обнаружил глюк TCP клиента
Ну и при чем здесь TCP клиент
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26306
Рейтинг: 2146
#3: 2013-03-15 10:39:40 ЛС | профиль | цитата
Gunnman писал(а):
Обнаружил глюк TCP клиента

Это не глюк TCP_Client-a, это попытка его запуска из другого потока. Лечится вот так, самый наипростейший вариант

Add(MainForm,3094849,133,175)
{
Width=269
Height=302
}
Add(WinExec,13416984,287,175)
{
FileName="ping.exe"
Point(doConsoleExec)
Point(onConsoleResult)
link(onConsoleResult,6943849:doNext,[])
}
Add(HTTP_PostBuilder,1109224,434,182)
{
URL="/downloads.php"
Host="php.net"
link(onBuild,985665:doEvent1,[])
}
Add(TCP_Client,10808638,532,182)
{
Port=80
IP="69.147.83.199"
link(onRead,217000:doAdd,[])
}
Add(Hub,985665,483,182)
{
link(onEvent1,10808638:doOpen,[])
link(onEvent2,10808638:doSend,[(515,195)(515,202)])
}
Add(Memo,217000,588,182)
{
Left=20
Top=45
Height=195
}
Add(CounterEx,6943849,336,182)
{
link(onNext,5949645:doCompare,[])
}
Add(If_else,5949645,385,182)
{
Op2=String(2)
link(onTrue,1109224:doBuild,[])
}
Add(Button,16647454,224,175)
{
Left=20
Top=20
Caption="1"
link(onClick,13416984:doConsoleExec,[(272,181)(272,195)])
}
Add(HTTP_PostBuilder,5381180,301,280)
{
URL="/downloads.php"
Host="php.net"
link(onBuild,5690273:doEvent1,[])
}
Add(TCP_Client,16466663,399,280)
{
Port=80
IP="69.147.83.199"
link(onRead,7685173:doAdd,[])
}
Add(Hub,5690273,350,280)
{
link(onEvent1,16466663:doOpen,[])
link(onEvent2,16466663:doSend,[(382,293)(382,300)])
}
Add(Memo,7685173,469,280)
{
Left=140
Top=45
Height=195
}
Add(Button,4347869,224,280)
{
Left=140
Top=20
Caption="2"
link(onClick,5381180:doBuild,[])
}
Add(TCP_Server,10138576,70,175)
{
@Hint=#13:Пустой сервер|
AddHint(47,-32,90,13,@Hint)
}


Вот только почему это работает я без понятия, так что, не спрашивай
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#4: 2013-03-15 11:48:22 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2025-01-10 18:27:03
карма: 0

0
Разработчик
Ответов: 26306
Рейтинг: 2146
#5: 2013-03-15 11:55:49 ЛС | профиль | цитата
host-109-235-189-9.bisv.r писал(а):
А как в дальнейшем определять сколько потоков в программе?

Через диспетчер задач
------------ Дoбавленo в 11.55:
Нашел, что влияет на работу в потоках -- для работы в потоках должен быть создан любой экземпляр сокета, неважно какого, до запуска в потоках, можно даже его не инициализировать, главное, что бы было создано его окно обработчика сообщений. Можно добавить такую заглушку в TCP_Client
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#6: 2013-03-15 12:13:59 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2025-01-10 18:27:03
карма: 0

0
Разработчик
Ответов: 26306
Рейтинг: 2146
#7: 2013-03-15 13:09:19 ЛС | профиль | цитата
Вообще-то, этого делать не стоит только потому, что точка onRead никогда не будет работать в другом потоке, даже если разрешить такое использование, тк эта точка везде привязана только к одному обработчику сокетов, а он находится всегда в отдельном специальном потоке асинхронных сокетов. Откуда возникает вопрос -- какой смысл работы TCP_Client-a в дргих потоках, когда обработка сообщений происходит только в одном
Откуда и происходит нестыковка при попытке создания первого сокета в другом потоке (вот у тебя и работало сначала 2, а потом 1, но не работало наоборот, тк первый созданный сокет был привязан к главному потоку наследованием, а окно обработчика сообщений сокетов создается всегда только одно), что приводит к созданию окна обработчика, привязанного к чужому потоку, который не имеет своего собственного обработчика, привязанного к главному обработчику приложения
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#8: 2013-03-15 16:53:36 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2025-01-10 18:27:04
карма: 0

0
Разработчик
Ответов: 26306
Рейтинг: 2146
#9: 2013-03-15 17:38:50 ЛС | профиль | цитата
95x153x163x62.kubangsm.ru писал(а):
если требуется после парсинга результата ( процент потерь) ping выполнять действие?

Без потерь и без доп потоков как-то так можно

Add(WinExec,13416984,266,175)
{
FileName="ping.exe php.net"
Point(doConsoleExec)
Point(onConsoleResult)
link(onConsoleResult,16609347:doCompare,[])
}
Add(HTTP_PostBuilder,1109224,476,245)
{
URL="/downloads.php"
Host="php.net"
link(onBuild,985665:doEvent1,[])
}
Add(TCP_Client,10808638,574,245)
{
Port=80
IP="69.147.83.199"
link(onRead,217000:doAdd,[])
}
Add(Hub,985665,525,245)
{
link(onEvent1,10808638:doOpen,[])
link(onEvent2,10808638:doSend,[(557,258)(557,265)])
}
Add(Memo,217000,630,245)
{
Left=20
Top=30
Width=265
Height=195
}
Add(Button,16647454,168,189)
{
Left=125
Top=230
Caption="1"
link(onClick,10272738:doEvent1,[])
}
Add(MainForm,2953706,168,140)
{
Width=323
Height=302
}
Add(Switch,2619525,385,175)
{
DataOn=Integer(1)
DataOff=Integer(0)
Point(State)
Point(doOn)
}
Add(IndexToChanel,14868674,385,231)
{
Point(Index)
link(onEvent2,8010520:doEvent1,[])
link(Index,2619525:State,[])
}
Add(Hub,8010520,434,238)
{
link(onEvent1,12490627:doStop,[(459,244)(459,272)(319,272)(319,244)])
link(onEvent2,1109224:doBuild,[])
}
Add(Hub,10272738,217,189)
{
link(onEvent1,13416984:doConsoleExec,[])
link(onEvent2,12490627:doTimer,[(256,202)(256,237)])
}
Add(Timer,12490627,329,231)
{
Interval=100
Enable=1
link(onTimer,14868674:doEvent,[])
}
Add(StrMask,16609347,329,182)
{
Mask="*= 4,*= 4,*"
link(onFalse,2619525:doReset,[])
link(onTrue,2619525:doOn,[])
}


Маску сам отрегулируешь, и процент, думаю, тоже можно посчитать
карма: 22

1
Голосовали:Gunnman
Ответов: 655
Рейтинг: 18
#10: 2013-03-15 17:51:49 ЛС | профиль | цитата
nesco, Спасибо! Выполнение POST запроса происходит от главного потока я правильно понял?
карма: 0

0
Разработчик
Ответов: 26306
Рейтинг: 2146
#11: 2013-03-15 18:55:47 ЛС | профиль | цитата
Gunnman писал(а):
Выполнение POST запроса происходит от главного потока я правильно понял?

Да это вообще текстовый билдер, откуда запустили, там и будет работать
карма: 22

0
11
Сообщение
...
Прикрепленные файлы
(файлы не залиты)