Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ServerSocket dll MsSql странности...


Katy ©   (2003-03-18 12:15:00) 

помогите плз

ситуация: нужно посылать оповешения пользователям на изменения данных в таблице MsSql сеовера. Рассмотрев все варианты решила, написать dll на Delphi используя TServerSocket.

написала dll в которой на выходе 3 функции
создать сервер, убить сервер и послать мессагу (пока всем кто подключился)

dll вполне корректно работает, если её вызывать из обычной проги.

Заригистрила на MsSql сервере сервер создаеться и убиваеться вполне корректно. Причем даже клиенты его видять, те когда от клиента сообшение уходит ошибки не возникает. Но когда пытаюсь отправить сообшение с сервера на клиентов начинаються странности, почему-то оказываеться что конектов 0.

код dll лежит сдесь
http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=25763
на том форуме пока молчат :(

Может у кого нибудь есть уже реализовывал подобную фичу. Может быть дело в настройках MsSql 2000 ?


Digitman   (2003-03-19 08:15:00) [1]

да, правильно ты поняла.
не вдаваясь в подробности : новый код.поток - это собственно и есть то, что происходит в Execute()


Katy   (2003-03-19 07:40:00) [2]

Digitman
ОГРОМНОЕ СПАСИБО!
помогло :)


Katy   (2003-03-19 07:23:00) [3]

Digitman
правильно ли я поняла, что просто запустив новый поток с этим циклом после создания обьекта TServerSocket я ситуацию не изменила. Те нужно именно в новом потоке создавать этот обьект.
Так?


Digitman   (2003-03-18 15:46:00) [4]

его никак не надо передавать)

в Execute() нужно просто сделать все, что ты делала без Execute(), и после этого организовать цикл ожидания/диспетчеризации сообщений


Katy   (2003-03-18 15:29:00) [5]

Polevi
да я читала статью
Сервис событий в SQL-сервере (Глеб Уфимцев)
http://www.sql.ru/articles/mssql/02040201AlertServiceForSQLserv.shtml
решение действительно красивое.

Digitman
я же извинилась :) Я правда не понимаю. Те в Execute я ловлю событие а как его в ServerSocket передать? Можно пример.


Digitman   (2003-03-18 15:10:00) [6]

как это - какая ? все что ты делаешь с ServerSocket - все д.б. организовано в Execute() !


Polevi   (2003-03-18 15:09:00) [7]

для данной задачи лучше использовать другой способ
допустим есть некая Extened Stored Proc (EPC), с ф-иями

function CreateWaitEvent;
var
evtHandle:THandle;
begin
evtHandle:=OpenEvent(EVENT_ALL_ACCESS,false,"MySuperEvent");
if evtHandle<>0 then
CloseHandle(evtHandle)
else
evtHandle:=CreateEvent(nil,true,false,"MySuperEvent");
end;

function Wait:integer;
var
evtHandle:THandle;
begin
evtHandle:=OpenEvent(EVENT_ALL_ACCESS,false,"MySuperEvent");
WaitForSinleObject(evtHandle,60000); //ждем 1 минуту
CloseHandle(evtHandle);
end

function Stop:integer;
var
evtHandle:THandle;
begin
evtHandle:=OpenEvent(EVENT_ALL_ACCESS,false,"MySuperEvent");
SetEvent(evtHandle);
ResetEvent(evtHandle);
CloseHandle(evtHandle);
end


есть StoredProc, типа
CREATE PROCEDURE GetMessage @R VARCHAR(512) OUTPUT
AS
EPC.CreateWaitEvent;
EPC.Wait;
SET @R=SELECT Msg FROM SomeTable
GO

CREATE PROCEDURE RaiseMessage @R VARCHAR(512)
AS
INSERT SomeTable (Msg) VALUES (@R)
EPC.Stop
GO

Если клиент хочет получать сообщения, он в доп кодовом потоке должен вызвать GetMessage - и заснет..

Если ктото вызовет RaiseMessage - сработает SetEvent и GetMessage возвратит управления для всех ожидающих клиентов


Katy   (2003-03-18 15:05:00) [8]

сори щас бооольшую глупость спрошу:
а какая должна быть там с ним работа?

и потом в этот цикл вообще не разу не зашли.


Digitman   (2003-03-18 14:37:00) [9]

ну и где же у тебя работа с ServerSocket в теле Execute ?

p.s. TranslateMessage() необязателен


Katy   (2003-03-18 14:30:00) [10]

создала поток

type
TWMThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;


procedure TWMThread.Execute;
var
Mesg : TMsg;
begin
CreateFileTest("d:\temp\1.txt");
while GetMessage(Mesg,0,0,0) do
begin
CreateFileTest("d:\temp\2.txt");
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end;

в xpSSCreate запускаю поток
vWMThread:=TWMThread.Create(False);

файл 1.txt создаеться и тишина ... Клиент конектиться и все равно не 2.txt не ClientWrite.txt не возникают :(


Digitman   (2003-03-18 13:45:00) [11]


1. никак. кроме изучения исх.текста MS SQL
но по кр.мере можно проверить, в каком код.потоке ядро MS SQL вызывает ф-ции из твоей DLL. Выясни любым способом ID осн.код.потока процесса MS SQL и сравни с ID код.потока, в котором исполняется любая из твоих эксп.ф-ций (просто получи этот ID вызовом GetCurrentThreadId). Программно сравни. Если ID"ы различны, то ф-ция твоя вызывается процессом сервера в доп.код.потоке, который, скорей всего, не предусматривает ожидание/диспетчеризацию/обработку ок.сообщений.

2. Все, что ты делаешь, следует реализовать в своем собственном доп.кодовом потоке, в котором ты вольна реализовать недостающий цикл. См. класс TThread


Katy   (2003-03-18 13:36:00) [12]

предположенеи интересное.
от сюда вопросы
1. как проверить
2. как выкрутиться


Digitman   (2003-03-18 13:26:00) [13]

предполодение - вызывающий код.поток не содержит цикла обработки оконных сообщений


Katy   (2003-03-18 13:24:00) [14]

А принцип то правильный или можно по другому обьекту реакцию на события присвоить?


Katy   (2003-03-18 13:16:00) [15]

грусно, но не помогло.
добавила:

в описанее класа в
public
constructor Create;
destructor Destroy; override;


constructor TMyClass.Create;
begin
end;

destructor TMyClass.Destroy;
begin
end;

и перед
ServerSocket1:=TServerSocket.Create(nil);
пишу MyClass:=TMyClass.Create;

так?

наверно все же не в этом дело, тем более, что аналогичная dll, вызываемая, из обычного приложения работает.


Digitman   (2003-03-18 12:54:00) [16]

и это - более чем странно


Katy   (2003-03-18 12:48:00) [17]

пасибо.
совсем заработалась, щас попробую поправть.

но Listen то срабатывает тем не менее


Digitman   (2003-03-18 12:41:00) [18]

И где же в твоем коде вызов конструктора/деструктора объекта TMyClass ? Того самого, к которому ты обращаешься по ссылке, лежащей якобы в переменной MyClass ? Что-то не вижу я ничего похожего.

Назначать в кач-ве обработчика события у одного объекта метод несуществующего (!) объекта недопустимо - это нонсенс


Наверх

Титульная страница Поиск, карта сайта Написать письмо