Форум: "Сети";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.014 c