Вверх ↑
Этот топик читают: Гость
Ответов: 1841
Рейтинг: 369
#1: 2010-02-07 20:01:49 ЛС | профиль | цитата
Всем привет!

Описание: Я делаю многопользовательскую БД на основе клиент - сервер и столкнулся с одной проблемой которую не могу побороть уже 2 дня...

Сама проблема: Имеется дочерняя форма (Ex, OnlyOnce) и имеется клиент - сервер, при открытии дочерней формы посылается запрос серверу (дочерняя форма после отправки запроса не должна закрываться) после сервер принимает запрос и посылает определённую информацию клиенту, клиент после принятия информации направляет её открытой дочерней форме для дальнейшей обработки этой информации не посредственно в ней но после получения данных дочерняя форма начинает (как я понял) перезапускаться тем самым получаем замкнуты круг...

Вопрос: Почему так происходит и как можно это побороть?

Пример:
code_16810.txt
карма: 1
0
файлы: 1code_16810.txt [2.8KB] [104]
Ответов: 4641
Рейтинг: 334
#2: 2010-02-07 20:26:16 ЛС | профиль | цитата
CriDos писал(а):
Почему так происходит и как можно это побороть?

наверно из за

OnlyOnce - создание копии схемы при вызове любого метода и уничтожение её при завершении работы этого метода

если вчитаться в смысл слов, то я предполагаю....что при окончании выполнение метода doShowModal, дочерняя форма просто уничтожается.
карма: 1
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 1841
Рейтинг: 369
#3: 2010-02-07 20:52:43 ЛС | профиль | цитата
Ravilr писал(а):
при окончании выполнение метода doShowModal, дочерняя форма просто уничтожается.

нет, она не уничтожается и не перезапускается (ток что провёл небольшой эксперимент).

Эксперимент №1:

Add(MainForm,12532610,325,162)
{
Width=403
Height=245
Caption="Пример"
Position=1
link(onCreate,4916086:doEvent1,[])
}
Add(BlockFind,6144790,492,405)
{
IncludeBlock=1
StartBlock="<sys>"
EndBlock="</sys>"
link(onSearch,1267441:doEvent1,[])
}
Add(LineBreak,297105,319,405)
{
Caption="Принятые данные с сервера"
link(Out,6144790:doSearch,[])
Primary=[9974996,405,-46]
}
Add(Button,11993697,502,366)
{
Left=167
Top=90
Width=65
Font=[Arial,8,0,0,204]
Caption="Пример"
link(onClick,10215024:doShowModal,[])
}
Add(ChildFormEx,10215024,575,366)
{
Mode=2
link(отправить,16389079:doEvent1,[])
link(Str2,7795866:Var2,[])
}
BEGIN_SDK
Add(EditMultiEx,12573465,21,21)
{
WorkCount=#11:doShowModal|2:In|
EventCount=#9:отправить|
DataCount=#4:Str2|
Width=349
Height=291
link(doShowModal,11539543:doShowModal,[(33,27)(33,111)])
link(In,9974996:In,[])
}
Add(MainForm,11539543,105,77)
{
Left=35
Top=105
Width=302
Height=161
Visible=1
Caption="Пример"
Position=1
Point(doShowModal)
link(onCreate,13662301:doEvent1,[])
}
Add(FormatStr,3228639,180,98)
{
DataCount=0
Mask="<sys>данные</sys>"
link(onFString,12043928:doWork,[])
}
Add(LineBreak,7371283,42,230)
{
Caption="входящии данные"
link(Out,10822052:doMessage,[])
Primary=[9974996,0,-202]
}
Add(LineBreakEx,12043928,226,98)
{
Caption="отправка запроса"
}
Add(LineBreakEx,11013808,249,21)
{
Caption="отправка запроса"
Type=1
link(OnEvent,12573465:отправить,[])
}
Add(Label,15714018,235,237)
{
Left=105
Top=40
Width=77
Height=28
Font=[MS Sans Serif,14,1,0,1]
Caption="И всё..."
}
Add(Message,10822052,170,230)
{
}
Add(StrCatDelim,6944786,60,77)
{
Delimiter=": "
Str1="кл-во событий"
link(onStrCatDlm,11539543:doCaption,[])
link(Str2,12573465:Str2,[(73,49)(27,49)])
}
Add(Hub,13662301,148,91)
{
link(onEvent1,6944786:doStrCatDlm,[(174,97)(174,90)(48,90)(48,83)])
link(onEvent2,3228639:doString,[])
}
END_SDK
Add(TCP_Client,8912125,680,359)
{
Port=71888
IP="127.0.0.1"
link(onRead,9974996:In,[])
}
Add(Hub,16389079,629,366)
{
link(onEvent1,8912125:doOpen,[(661,372)(661,365)])
link(onEvent2,8912125:doSend,[])
}
Add(TCP_Server,9064983,532,504)
{
Port=71888
link(onRead,4129968:doSeparateMT,[])
}
Add(LineBreak,10873750,322,504)
{
Caption="Принятые данные с клиента"
link(Out,13555939:doEvent1,[])
Primary=[7068180,297,0]
}
Add(LineBreak,16134263,418,519)
{
Caption="startserver"
link(Out,13555939:doEvent2,[(489,525)(489,517)])
Primary=[4511257,-22,-343]
}
Add(Hub,13555939,495,504)
{
InCount=2
link(onEvent1,9064983:doOpen,[])
link(onEvent2,9064983:doSend,[(521,517)(521,524)])
}
Add(InfoTip,12847072,315,210)
{
Info=#16:Клиентская часть|
Width=589
Height=242
}
Add(InfoTip,11494280,315,455)
{
Info=#15:Серверная часть|
Width=505
Height=137
}
Add(MT_MultiData,4129968,575,504)
{
Count=1
link(onData1,7068180:In,[])
}
Add(Hub,4916086,368,176)
{
link(onEvent1,4511257:In,[])
link(onEvent2,16380555:doStart,[(391,189)(391,329)])
}
Add(Hub,1267441,533,405)
{
link(onEvent1,287775:doNext,[(561,411)(561,243)])
link(onEvent2,10215024:In,[(568,418)(568,379)])
}
Add(Counter,287775,575,237)
{
Max=1410065407
}
Add(Thread,16380555,448,323)
{
Delay=15
BusyEvent=1
link(onExec,6944786:doStrCatDlm,[])
}
Add(StrCatDelim,6944786,512,323)
{
Delimiter=":"
Str1="кл-во событий"
link(onStrCatDlm,6340914:In,[])
link(Str2,7795866:Var1,[(525,296)])
}
Add(LineBreak,6298499,247,162)
{
Caption="SetCaption"
link(Out,12532610:doCaption,[])
Primary=[6340914,319,161]
}
Add(GetDataEx,7795866,575,291)
{
link(Data,287775:Count,[])
}
------------ Дoбавленo в 21.22:
Эксперимент №2:

Add(MainForm,12532610,325,162)
{
Width=403
Height=245
Caption="Пример"
Position=1
link(onCreate,4511257:In,[])
}
Add(BlockFind,6144790,499,286)
{
IncludeBlock=1
StartBlock="<sys>"
EndBlock="</sys>"
link(onSearch,10215024:In,[(549,292)(549,253)])
}
Add(LineBreak,297105,326,286)
{
Caption="Принятые данные с сервера"
link(Out,6144790:doSearch,[])
Primary=[9974996,391,-53]
}
Add(Button,11993697,495,240)
{
Left=167
Top=90
Width=65
Font=[Arial,8,0,0,204]
Caption="Пример"
link(onClick,10215024:doShowModal,[])
}
Add(ChildFormEx,10215024,568,240)
{
Mode=2
link(отправить,16389079:doEvent1,[])
}
BEGIN_SDK
Add(EditMultiEx,12573465,21,21)
{
WorkCount=#11:doShowModal|2:In|
EventCount=#9:отправить|
Width=349
Height=193
link(doShowModal,11539543:doShowModal,[(63,27)(63,111)])
link(In,9974996:In,[])
}
Add(MainForm,11539543,105,77)
{
Left=35
Top=105
Width=302
Height=161
Visible=1
Caption="Пример"
Position=1
Point(doShowModal)
link(onCreate,13662301:doEvent1,[])
}
Add(FormatStr,3228639,180,98)
{
DataCount=0
Mask="<sys>данные</sys>"
link(onFString,12043928:doWork,[])
}
Add(LineBreak,7371283,49,153)
{
Caption="входящие данные"
link(Out,10822052:doMessage,[])
Primary=[9974996,-7,-125]
}
Add(LineBreakEx,12043928,226,98)
{
Caption="отправка запроса"
}
Add(LineBreakEx,11013808,242,21)
{
Caption="отправка запроса"
Type=1
link(OnEvent,12573465:отправить,[])
}
Add(Label,15714018,242,160)
{
Left=105
Top=40
Width=77
Height=28
Font=[MS Sans Serif,14,1,0,1]
Caption="И всё..."
}
Add(Message,10822052,177,153)
{
}
Add(Hub,13662301,148,91)
{
link(onEvent1,16380555:doStart,[(168,97)(168,69)])
link(onEvent2,3228639:doString,[])
}
Add(Thread,16380555,177,63)
{
Delay=30
BusyEvent=1
link(onExec,287775:doNext,[])
}
Add(Counter,287775,225,63)
{
Max=1410065407
link(onNext,11539543:doCaption,[(269,69)(269,53)(93,53)(93,83)])
}
END_SDK
Add(TCP_Client,8912125,673,233)
{
Port=71888
IP="127.0.0.1"
link(onRead,9974996:In,[])
}
Add(Hub,16389079,622,240)
{
link(onEvent1,8912125:doOpen,[(654,246)(654,239)])
link(onEvent2,8912125:doSend,[])
}
Add(TCP_Server,9064983,532,385)
{
Port=71888
link(onRead,4129968:doSeparateMT,[])
}
Add(LineBreak,10873750,322,385)
{
Caption="Принятые данные с клиента"
link(Out,13555939:doEvent1,[])
Primary=[7068180,297,0]
}
Add(LineBreak,16134263,418,400)
{
Caption="startserver"
link(Out,13555939:doEvent2,[(489,406)(489,398)])
Primary=[4511257,-36,-224]
}
Add(Hub,13555939,495,385)
{
InCount=2
link(onEvent1,9064983:doOpen,[])
link(onEvent2,9064983:doSend,[(521,398)(521,405)])
}
Add(InfoTip,12847072,315,210)
{
Info=#16:Клиентская часть|
Width=589
Height=130
}
Add(InfoTip,11494280,315,343)
{
Info=#15:Серверная часть|
Width=505
Height=109
}
Add(MT_MultiData,4129968,575,385)
{
Count=1
link(onData1,7068180:In,[])
}
карма: 1
0
Ответов: 4641
Рейтинг: 334
#4: 2010-02-07 21:35:51 ЛС | профиль | цитата
CriDos писал(а):
не уничтожается

ну не знай... я так экспериментирую
code_16812.txt

карма: 1
Время верстки: %cr_time% Текущее время: %time%
1
файлы: 1code_16812.txt [497B] [74]
Голосовали:CriDos
Ответов: 1841
Рейтинг: 369
#5: 2010-02-07 21:42:30 ЛС | профиль | цитата
Ты оказался прав...
------------ Дoбавленo в 21.53:
Нашёл решение этой проблемы!
Всё оказалось оч просто...
Нужно было запрос отправлять не после вызова модальной формы (от события onCreate) а ДО вызова модальной формы...

Пример (Может кому нибудь пригодится):

Add(MainForm,3540986,179,113)
{
Width=403
Height=135
Caption="Пример"
Position=1
link(onCreate,4511257:In,[])
}
Add(BlockFind,6144790,361,259)
{
IncludeBlock=1
StartBlock="<sys>"
EndBlock="</sys>"
link(onSearch,10215024:In,[(403,265)(403,235)])
}
Add(LineBreak,13066506,188,259)
{
Caption="Принятые данные с сервера"
link(Out,6144790:doSearch,[])
Primary=[9974996,367,-44]
}
Add(Button,11993697,361,222)
{
Left=162
Top=40
Width=65
Font=[Arial,8,0,0,204]
Caption="Пример"
link(onClick,10215024:doShowModal,[])
}
Add(ChildFormEx,10215024,413,222)
{
Mode=2
link(отправить,16389079:doEvent1,[])
}
BEGIN_SDK
Add(EditMultiEx,12573465,21,21)
{
WorkCount=#11:doShowModal|2:In|
EventCount=#9:отправить|
Width=307
Height=235
link(doShowModal,16259958:doEvent1,[(42,27)(42,90)])
link(In,9974996:In,[])
}
Add(MainForm,11539543,98,98)
{
Left=35
Top=105
Width=302
Height=161
Visible=1
Caption="Пример"
Position=1
Point(doShowModal)
}
Add(FormatStr,3228639,138,84)
{
DataCount=0
Mask="<sys>данные</sys>"
link(onFString,12043928:doWork,[])
}
Add(LineBreak,7608299,56,167)
{
Caption="входящии данные"
link(Out,9220953:doMessage,[])
Primary=[9974996,0,-139]
}
Add(LineBreakEx,12043928,184,84)
{
Caption="отправка запроса"
}
Add(LineBreakEx,11013808,200,21)
{
Caption="отправка запроса"
Type=1
link(OnEvent,12573465:отправить,[])
}
Add(Message,9220953,171,167)
{
}
Add(Label,15714018,28,287)
{
Left=105
Top=40
Width=77
Height=28
Font=[MS Sans Serif,14,1,0,1]
Caption="И всё..."
}
Add(Hub,16259958,63,84)
{
link(onEvent1,3228639:doString,[])
link(onEvent2,11539543:doShowModal,[(84,97)(84,132)])
}
END_SDK
Add(TCP_Client,8912125,511,215)
{
Port=71888
IP="127.0.0.1"
link(onRead,9974996:In,[])
}
Add(Hub,16389079,460,222)
{
link(onEvent1,8912125:doOpen,[(492,228)(492,221)])
link(onEvent2,8912125:doSend,[])
}
Add(TCP_Server,9064983,399,378)
{
Port=71888
link(onRead,4129968:doSeparateMT,[])
}
Add(LineBreak,10343087,189,378)
{
Caption="Принятые данные с клиента"
link(Out,13555939:doEvent1,[])
Primary=[7068180,297,0]
}
Add(LineBreak,10771815,285,393)
{
Caption="startserver"
link(Out,13555939:doEvent2,[(356,399)(356,391)])
Primary=[4511257,-56,-266]
}
Add(Hub,13555939,362,378)
{
InCount=2
link(onEvent1,9064983:doOpen,[])
link(onEvent2,9064983:doSend,[(388,391)(388,398)])
}
Add(InfoTip,12847072,168,175)
{
Info=#16:Клиентская часть|
Width=575
Height=137
}
Add(InfoTip,11494280,168,322)
{
Info=#15:Серверная часть|
Width=491
Height=137
}
Add(MT_MultiData,4129968,442,378)
{
Count=1
link(onData1,7068180:In,[])
}
карма: 1
0
Ответов: 3349
Рейтинг: 233
#6: 2010-02-08 07:13:21 ЛС | профиль | цитата
Можно было и стаймером сделать
code_16823.txt
карма: 1

0
файлы: 1code_16823.txt [3.3KB] [108]
Ответов: 1841
Рейтинг: 369
#7: 2010-02-08 12:10:24 ЛС | профиль | цитата
хм, вот нашёл ещё одну проблему которую не могу побороть...

Пример проблемы:

Add(MainForm,2953706,155,7)
{
Width=327
Height=102
Caption="Пример"
Position=1
link(onCreate,4511257:In,[])
}
Add(TCP_Client,8912125,406,224)
{
Port=71888
IP="127.0.0.1"
DataType=3
link(onRead,4512667:doConvert,[])
}
Add(Hub,16389079,334,231)
{
InCount=2
link(onEvent1,8912125:doOpen,[(370,237)(370,230)])
link(onEvent2,2551797:doConvert,[])
}
Add(Convertor,2551797,362,238)
{
Mode=12
link(onResult,8912125:doSend,[])
}
Add(Convertor,4512667,456,224)
{
Mode=11
link(onResult,16637434:In,[])
}
Add(Button,2643459,228,231)
{
Left=23
Top=19
Width=280
Height=30
Font=[Arial,8,0,0,204]
Caption="Отправить запрос для открытья дочерней формы"
link(onClick,105874:doData,[])
}
Add(ChildFormEx,11559574,272,281)
{
link(Out,16389079:doEvent2,[(315,287)(315,244)])
}
BEGIN_SDK
Add(EditMultiEx,11485040,-63,7)
{
WorkCount=#11:doShowModal|
EventCount=#3:Out|
Width=370
Height=333
link(doShowModal,3356443:doShowModal,[(-53,13)(-53,55)])
}
Add(MainForm,3356443,-29,21)
{
Left=35
Top=105
Width=287
Height=172
Visible=1
Caption="Дочерняя форма примера"
BorderStyle=4
Position=1
Point(doShowModal)
Point(Handle)
}
Add(Button,11993697,196,12)
{
Left=105
Top=27
Width=65
Font=[Arial,8,1,0,204]
Caption="Пример"
link(onClick,10215024:doShowModal,[])
}
Add(ChildFormEx,10215024,243,12)
{
Mode=2
link(отправить,11485040:Out,[(294,18)(294,13)])
}
BEGIN_SDK
Add(EditMultiEx,12573465,21,21)
{
WorkCount=#11:doShowModal|
EventCount=#9:отправить|
Width=195
Height=193
link(doShowModal,9525047:doEvent1,[])
}
Add(MainForm,11539543,119,70)
{
Left=35
Top=105
Width=380
Height=116
Visible=1
Caption="Пример"
Position=1
Point(doShowModal)
}
Add(Hub,9525047,63,21)
{
link(onEvent1,6591988:doData,[])
link(onEvent2,11539543:doShowModal,[(98,34)(98,104)])
}
Add(DoData,6591988,147,21)
{
Data=String(get)
link(onEventData,12573465:отправить,[])
}
Add(Label,6189344,28,98)
{
Left=17
Top=20
Width=348
Height=20
Font=[MS Sans Serif,10,1,0,1]
Caption="Почему эта дочерняя форма не закрывается?"
}
Add(Button,15195830,70,91)
{
Left=130
Top=55
Width=125
Font=[MS Sans Serif,8,1,0,1]
Caption="Закрыть"
link(onClick,11539543:doClose,[])
}
END_SDK
END_SDK
Add(LineBreak,15036511,162,274)
{
Caption="indata"
link(Out,11581496:doCase,[])
Primary=[16637434,341,-50]
}
Add(DoData,105874,273,231)
{
Data=String(open)
link(onEventData,16389079:doEvent1,[])
}
Add(Case,11581496,224,274)
{
Value=String(start)
link(onTrue,11559574:doShowModal,[])
}
Add(TCP_Server,9064983,420,98)
{
Port=71888
DataType=3
link(onRead,435684:doConvert,[])
}
Add(Convertor,435684,467,98)
{
Mode=11
link(onResult,1266155:doEvent1,[])
}
Add(Convertor,12867642,373,112)
{
Mode=12
link(onResult,9064983:doSend,[])
}
Add(Hub,1266155,516,98)
{
link(onEvent1,10141270:In,[(545,104)(545,96)])
link(onEvent2,14362109:In,[])
}
Add(LineBreak,15179103,281,70)
{
Caption="start"
link(Out,1485232:doEvent1,[(329,76)(329,111)])
Primary=[4511257,-77,-49]
}
Add(LineBreak,2770144,163,88)
{
Caption="indata"
link(Out,13687082:doCase,[])
Primary=[14362109,394,17]
}
Add(Hub,1485232,343,105)
{
InCount=3
link(onEvent1,9064983:doOpen,[(389,111)(389,104)])
link(onEvent2,12867642:doConvert,[])
}
Add(LineBreak,686844,167,132)
{
Caption="indata"
link(Out,9242116:doCase,[])
Primary=[10141270,389,-42]
}
Add(Case,9242116,224,132)
{
Value=String(get)
link(onTrue,1485232:doEvent3,[(308,145)(308,125)])
}
Add(Case,13687082,224,88)
{
Value=String(open)
link(onTrue,8836776:doData,[])
}
Add(DoData,8836776,267,95)
{
Data=String(start)
link(onEventData,1485232:doEvent2,[(321,101)(321,118)])
}
Add(InfoTip,5369934,147,49)
{
Info=#15:Серверная часть|
Width=470
Height=137
}
Add(InfoTip,14810994,147,196)
{
Info=#16:Клиентская часть|
Width=414
Height=137
}

Собственно вопрос: Почему дочерняя форма после вызова не хочет закрываться не после нажатия на системный крестик не через точку doClose?
карма: 1
0
Разработчик
Ответов: 4698
Рейтинг: 426
#8: 2010-02-08 13:42:12 ЛС | профиль | цитата
Смотри объяснить смогу, а решить пробую:
Ты отправляешь сигнал Get при нажатии "Закрыть" в последней форме, в разных прогах будет все ок, но здесь отправление происходит в одном потоке, а примем в другом => пока не завершится поток с хабом(который вызывает закрытие формы после отправки сигнала) не будет принято сообщение у сервера, а так как форма модальная, главный поток стопорится и не происходит закрытия(так как сигнал у сервера не принят), пока не завершится поток в котором модальная форма
------------ Дoбавленo в 13.42:
Если не шибко важна модальность, то убери ее и все заработает
карма: 10
1
Голосовали:CriDos
Ответов: 1841
Рейтинг: 369
#9: 2010-02-08 13:51:26 ЛС | профиль | цитата
Assasin, понятно
карма: 1
0
файлы: 1code_16828.txt [1.4KB] [131]
9
Сообщение
...
Прикрепленные файлы
(файлы не залиты)