nt服务的问题(老大门救命) ( 积分: 100 )

  • 主题发起人 主题发起人 zql1982000
  • 开始时间 开始时间
Z

zql1982000

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个nt服务 大概的想法就是每隔几分钟检测一西数据库里面有没有新的东西
但是我加了如下一段后在在服务过程中之后启动服务就老说服务魔芋什么可以做 注释掉就可以了,我的服务里面有一个死循环,服务过程是不可能结束的啊,怎么回事
如果我把
i:=0;
while i=0do

begin
ADOSelect.SQL.Clear;//清除上次的数据记录
ADOSelect.SQL.Add('select Id,DesPhone,Content,AddCode From [S_HL_SMSMT] order by ID asc');

ADOSelect.Open;
While not ADOSelect.Eofdo
begin
ThreadIntro[ThreadFreeListNUm][2]:=ADOSelect.Recordset.Fields[0].Value;
ThreadIntro[ThreadFreeListNUm][3]:=ADOSelect.Recordset.Fields[1].Value;
ThreadIntro[ThreadFreeListNUm][4]:=ADOSelect.Recordset.Fields[2].Value;
ThreadIntro[ThreadFreeListNUm][5]:=ADOSelect.Recordset.Fields[3].Value;
TSendSmsThread.Create(ThreadFreeList[ThreadFreeListNUm]);
ThreadFreeListNUm:=ThreadFreeListNUm-1;//采用数组倒置的赋值
end;
ADOSelect.Close;
Sleep(20000);
ServiceThread.ProcessRequests(False);
end
如果我把这段注释掉就好了
ADOSelect.Open;
While not ADOSelect.Eofdo
begin
ThreadIntro[ThreadFreeListNUm][2]:=ADOSelect.Recordset.Fields[0].Value;
ThreadIntro[ThreadFreeListNUm][3]:=ADOSelect.Recordset.Fields[1].Value;
ThreadIntro[ThreadFreeListNUm][4]:=ADOSelect.Recordset.Fields[2].Value;
ThreadIntro[ThreadFreeListNUm][5]:=ADOSelect.Recordset.Fields[3].Value;
TSendSmsThread.Create(ThreadFreeList[ThreadFreeListNUm]);
ThreadFreeListNUm:=ThreadFreeListNUm-1;//采用数组倒置的赋值
end;
ADOSelect.Close;
 
我写了一个nt服务 大概的想法就是每隔几分钟检测一西数据库里面有没有新的东西
但是我加了如下一段后在在服务过程中之后启动服务就老说服务魔芋什么可以做 注释掉就可以了,我的服务里面有一个死循环,服务过程是不可能结束的啊,怎么回事
如果我把
i:=0;
while i=0do

begin
ADOSelect.SQL.Clear;//清除上次的数据记录
ADOSelect.SQL.Add('select Id,DesPhone,Content,AddCode From [S_HL_SMSMT] order by ID asc');

ADOSelect.Open;
While not ADOSelect.Eofdo
begin
ThreadIntro[ThreadFreeListNUm][2]:=ADOSelect.Recordset.Fields[0].Value;
ThreadIntro[ThreadFreeListNUm][3]:=ADOSelect.Recordset.Fields[1].Value;
ThreadIntro[ThreadFreeListNUm][4]:=ADOSelect.Recordset.Fields[2].Value;
ThreadIntro[ThreadFreeListNUm][5]:=ADOSelect.Recordset.Fields[3].Value;
TSendSmsThread.Create(ThreadFreeList[ThreadFreeListNUm]);
ThreadFreeListNUm:=ThreadFreeListNUm-1;//采用数组倒置的赋值
end;
ADOSelect.Close;
Sleep(20000);
ServiceThread.ProcessRequests(False);
end
如果我把这段注释掉就好了
ADOSelect.Open;
While not ADOSelect.Eofdo
begin
ThreadIntro[ThreadFreeListNUm][2]:=ADOSelect.Recordset.Fields[0].Value;
ThreadIntro[ThreadFreeListNUm][3]:=ADOSelect.Recordset.Fields[1].Value;
ThreadIntro[ThreadFreeListNUm][4]:=ADOSelect.Recordset.Fields[2].Value;
ThreadIntro[ThreadFreeListNUm][5]:=ADOSelect.Recordset.Fields[3].Value;
TSendSmsThread.Create(ThreadFreeList[ThreadFreeListNUm]);
ThreadFreeListNUm:=ThreadFreeListNUm-1;//采用数组倒置的赋值
end;
ADOSelect.Close;
 
Sleep(20000);
--你可以用Timer来作
ADOSelect.first;
While not ADOSelect.Eofdo
ADOSelect.next;
 
谢谢,你说的哪个方法是可以的
不过后来我自己在进程里面分发了一个线程,然后由线程去做就没有事了
但是我想问一下,造成个个原因是不是因为加如了数据库组件的时候服务进程是不是被转移了
而造成它无法循环下去而不能维持上面的一个while循环了
那位知道这是什么原因 我只是想知道为什么而已
 
你的原因就是因为:
当你打开数据集后,如果有数据,则数据指针是指向第一条记录的,如果没有数据指镇针是bof和eof。
先要看你的数据集里有没有记录:如果没有就不会出现你所说的现象。
如果有,当你打开数据集后指针在第一条记录,而的你while的条件是没有到eof时就循环,但在你的循环体内又没有改变指针的命令,所以它永远不会有eof.
ADOSelect.Open;
While not ADOSelect.Eofdo
begin
ThreadIntro[ThreadFreeListNUm][2]:=ADOSelect.Recordset.Fields[0].Value;
ThreadIntro[ThreadFreeListNUm][3]:=ADOSelect.Recordset.Fields[1].Value;
ThreadIntro[ThreadFreeListNUm][4]:=ADOSelect.Recordset.Fields[2].Value;
ThreadIntro[ThreadFreeListNUm][5]:=ADOSelect.Recordset.Fields[3].Value;
TSendSmsThread.Create(ThreadFreeList[ThreadFreeListNUm]);
ThreadFreeListNUm:=ThreadFreeListNUm-1;//采用数组倒置的赋值
ADOSelect.next;//此处加一条
end;
 
首先肯定有数据在数据库中 ADOSelect.next就是将记录指向下一条啊向下滚啊
 
晕,问题是你的代码没加ADOSelect.next呀
 
nt服务 和 dll 一樣, 要用到 activeX 的東西, 要先初始化環境!!!
 
在代碼之前加:
CoInitialize(nil);
最後用: CoUninitialize
 
多人接受答案了。
 
后退
顶部