Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.15;
Скачать: CL | DM;

Вниз

ServerSocket dll MsSql странности...   Найти похожие ветки 

 
Katy ©   (2003-03-18 12:15) [0]

помогите плз

ситуация: нужно посылать оповешения пользователям на изменения данных в таблице 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-18 12:41) [1]

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

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


 
Katy ©   (2003-03-18 12:48) [2]

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

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


 
Digitman ©   (2003-03-18 12:54) [3]

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


 
Katy ©   (2003-03-18 13:16) [4]

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

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


constructor TMyClass.Create;
begin
end;

destructor TMyClass.Destroy;
begin
end;

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

так?

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


 
Katy ©   (2003-03-18 13:24) [5]

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


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

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


 
Katy ©   (2003-03-18 13:36) [7]

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


 
Digitman ©   (2003-03-18 13:45) [8]


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

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


 
Katy ©   (2003-03-18 14:30) [9]

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

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 14:37) [10]

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

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


 
Katy ©   (2003-03-18 15:05) [11]

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

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


 
Polevi ©   (2003-03-18 15:09) [12]

для данной задачи лучше использовать другой способ
допустим есть некая 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 возвратит управления для всех ожидающих клиентов



 
Digitman ©   (2003-03-18 15:10) [13]

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


 
Katy ©   (2003-03-18 15:29) [14]

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

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


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

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

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


 
Katy ©   (2003-03-19 07:23) [16]

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



 
Katy ©   (2003-03-19 07:40) [17]

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


 
Digitman ©   (2003-03-19 08:15) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2003.05.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
1-46797
sagchat
2003-05-01 15:14
2003.05.15
Как удалить все файлы с указаным расширением?


4-47054
diMAN
2003-03-13 13:26
2003.05.15
Получение изображения с невидимого окна


4-47052
_BasiL_
2003-03-18 09:27
2003.05.15
Перехват потока открытия файлов


14-47003
Hint
2003-04-28 12:37
2003.05.15
Исходники за деньги


14-46980
_PG_gaws
2003-04-21 13:18
2003.05.15
Помогите !!!!!!!!!!!(Как перехватить нажатие кнопки Maximize)