Multithread in VB6

9 отговора 369 прегледа
#1

Multithread in VB6

Как бихте го реализирали? Програмата е във вид на сървър, и чака Connection request, като не се знае колко ще са възможните Connections...

----------------------------------
помислих, хареса ми, помислих пак...
Отговор
в отговор на Щиpлиц #2

Re: Multithread in VB6

VB6 е много зле точно в това отношение, вариантите, които знам аз са 2 - или нещо с ActiveX(контролите по принцип се изпълняват в отделна нишка) или чрез windows API-тата( CreateThread, обаче гърми като за свтовно ). Най-добре го прави с нещо друго .

If you don't care where you are going any road will get you there
Отговор
в отговор на Щиpлиц #3

Re: Multithread in VB6

Може би и с Timer-и ще стане.

Отговор
в отговор на Щиpлиц #4

Re: Multithread in VB6

Тебе кво те грее, че са много конекциите? Нищо не ти пречи да си ги обработваш в една нишка.

Я вышел им наперерез!
Отговор
в отговор на Resurrector #5

Зависи как искаш да го реализираш..

za kwi konekcii stawa Duma ?

za takiwa s Bazi danni ili Сокет ?

Отговор
в отговор на Щиpлиц #6

Re: Multithread in VB6

Възможно е да използваш Microsoft Winsock Control като го създадеш като control array и при нов request да увеличаваш масива. Това е ако искаш директно да работиш.
Ако е за някаква бизнес логика аз ти препоръчвам да използваш COM+ и да се сложиш компонентите в него. COM+ предлага освен всичко друго и thread pool и може а обслужва доста конкурентни извиквания.

Боже колко мъка има на този свят Боже!
Отговор
в отговор на Щиpлиц #7

Ето един начин

който съвсем не е елегантен, усложнен, но върши работа. Доколкото разбирам поддържаш масив (или списък-препоръчително) от обекти с включен вътре winsock. И искаш когато някой клиент даде към сървъра заявка, чието изпълнение изисква повечко време, той да не се занимава само с него, а да изпълнява и другите. Можеш да си направиш отделна програма - AcviteX exe - Thread per Object - StandAlone, към която да хвърляш бавните заявки, след обработка тя да връща резултата в основния сървър, а той от своя страна - на клиента. Ето нещо примерно.
На "допълнителния" сървър за бавните заявки (LongQuery.exe) си правиш форма Form1 с таймер с минимален интервал, обявяваш в модул:
.......
Global Obj as Object 'обекта от основния сървър
Global StrQuery as String ' заявката от основния сървър
Global InProgress as Boolean
...........
и създаваш public клас query:

Public Sub SetQuery(O as Object, byval S as String)
if InProgress Then Exit Sub
InProgress=True
Set Obj=O
StrQuery=S
Load Form1
Form1.Timer1.Enabled=True 'по подразбиране трябва да е false
End Sub
.............

На таймера:
Private Sub Timer1_Timer
dim Rezult as String
Timer1.Enabled=False
'....анализираш заявката, правиш квото правиш
...........................
InProgress=False
Unload Me
Obj.EndQuerry Result
End Sub

На основния сървър имаш имаш клас User:
............................
Dim O as Object
Public Sub EndQuerry (byval Result as String)
Set O=Nothing
'изпращаш отговора на клиента
End Sub
.................
При получаване на заявка S от клента:
If Not (O Is Nothing) then Exit Sub ' не е завършила предната заявка на клиента
Set O=CreateObject("LongQuery.query")
O.SetQuery Me, S
....................

Трябва да има и по-лесен вариант, но не съм го открил, трябва да внимаваш за преплитане на събития, можеш на другия сървър на обявиш променлива за отказване и да имаш Sub CancelQuery и т.н....абе.....гадничко е. Но става

Отговор
в отговор на Щиpлиц #8

Re: Multithread in VB6

Ми, става въпрос за организирането на Game server. Играчите ще трябва да могат да се Лог-ват в вървъра, и кънекта не трябва да е ограничен по време. Сървъра от своя страна ще трябва да прослушва някой порт, при кънекшън рекюест - да прави сокет, и да пуска ново прослушване, но ще трябва да е на същия сокет, щото и не се знае колко играчи, откъде, и кога ще има.

Мислех да го реализирам като просто на всеки кънекшън рекюест правя нов обект за сокет, а през този, който е прослушвал до момента просто го използвам, за да запиша IP адреса на заявителя, и през друг порт направя сокет с новия обект, за да освободя основния порт, през който ще се чака заявка...

10х много за вниманието до момента.

----------------------------------
помислих, хареса ми, помислих пак...
Отговор
в отговор на Щиpлиц #9

Ама това е съвсем друго нещо

И няма нищо общо с Multithread. И е описано много добре в хелпа в глава "Как да използваме winsock control:)))
Във форма сладаш един winsock примерно с име WS. Задаваш му индекс 0, за да се разбере, че ще става въпрос за масив от контроли и Local Port, към който ще се вързват клиентите, примерно 1001 . Та този WS(0) ще е само за прослушване на порта и нищо друго:
Sub Form_Load()
WS(0).Listen
End Sub

Sub WS_ConnectionRequest(ByVal Index as Integer,ByVal RequestID)
If Index=0 then
Load WS(пореден индекс)
WS(пореден индекс).LocalPort=0
WS(пореден индекс).Accept RequestID 'друга контрола приема заявката
End If
Въпреки че клиента иска да се върже към порт 1001, където слуша е WS(0), той-WS(0) го свързва към друг уинсок на друг порт (когато задаваме LocalPort=0, всъщност казваме "някой свободен порт") И така клента си "мисли", че се е свързал към 1001, а всъщност се е свързал към някой друг свободен на сървъра порт и си комуникират. WS(0) се явява само "разпределител". Всички други индекси се създават динамично и, разбира се, при дисконект трябва да се ънлоадват.

Отговор
в отговор на Пaлячo #10

Re: Ама това е съвсем друго нещо

Брррр, това си имало и леснийки бря. Ама като спомена за хелпове ;о((( ужас. Майкрософт с този MSDN буквално се изложиха. От времето на QBasic бях свикнал да имам подръка свестни хелпове, но това няма много общо с тях.

----------------------------------
помислих, хареса ми, помислих пак...
Отговор