在delphi中如何用clientsocket进行实时发送。。即在数据库读取到数据就立即发送出去。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在delphi中如何用clientsocket进行实时发送。。即在数据库读取到数据就立即发送出去。。相关的知识,希望对你有一定的参考价值。

如果是数据库中直接可以发送出去的话, 就用触发器。

如果是自己开发程序, 需要程序来发送出去的话, 就在程序中用Timer控件,
在OnTimer事件中读取数据库中A表数据, A表需要用触发器来写入数据, 可以把需要发送出去的数据在触发器中写入到A表, 那么在程序每次读取到A表数据后就通过程序来发送, 这个不难吧?

我不知道你要发送的是具体数据呢, 还是数据集, 数据集就相对比较麻烦点了, 我也没研究过这个, 不知道是否可以用Stream来操作。追问

就是从数据库读取出来的数据。。这个需要触发器么。。我是新手一枚。都不懂的。。。能给个具体的代码么。。。

追答

要触发器的, 触发器在这里的职责就是把实时读取到数据  写进你指定的表,

然后程序呢就是读取你指定的表中数据, 读取到的不就是你要发送的数据吗?

[Demo]

/*触发器代码如下, 作用是把插入进来的数据, 写入到你指定的表:M_TB

注意, M_TB表结构必须和插入进来的数据结构一致*/

CREATE TRIGGER Tig_Writein_M_TB
ON TB_IM_Inf
AFTER INSERT
AS
Insert into M_TB select * from inserted

 

procedure TForm1.Timer1Timer(Sender: TObject);
begin
With ADOQuery1 do begin
Clsoe;
sql.Clear;
sql.Add(\'Select * from M_TB\');
open;
If Not Isempty then begin
//到这里说明收到了实时的信息, 你可以提取信息之后转发了
ClientSocket1.Socket.SendText(FieldByName(\'字段\').Asstring);
end;
end;
end;

 不一定是Sendext了, 根据实际读取的数据来选择如何发送, 比如文本, 图片, 文件等都可以。

追问

我不理解的是 为什么读取的数据要写进表里面。。而且要再从这个表里读出来。。。现在头大无比。不可以直接把从数据库中读取的数据发出去么。。。如果是读进表里面 这个表应该怎么定义。

追答

问题的关键不在\'为什么读取的数据要写进表里\', 如果不写进表里, 那么你可以让程序不停的去读取判断有没有新数据进来。 当你的表里面数据多的时候可能读取会有延时, 用触发器就可以先删除指定表中的数据, 再插入新数据, 永远只保存一条最新的数据, 只要查询不为空集就发送数据, 不是很清晰吗? 当然方法千千万, 要适合你的程序要求才是最好的。

参考技术A 实时就只有触发器了追问

这一块该怎么用呀。。能给具体解答一下么。。。具体是这么个情况。。我用数据库的时间与系统时间进行比较。。与系统时间相同 我就提取出这一整行数据。然后通过socket客户端发出去。。。能具体指点一下吗 最好能给个代码 因为真的是新人无助呀。。

Delphi 200XXE中如何用并行实现循环的计算

 

interface

uses
  Classes, SysUtils;

type
  TParallelProc = reference to procedure(i: Integer; ThreadID: Integer);

  TParallel = class(TThread)
  private
    FProc: TParallelProc;
    FThreadID: Integer; //current thread ID
  protected
    procedure Execute; override;
    function GetNextValue: Integer;
  public
    constructor Create;
    destructor Destroy; override;

    property Proc: TParallelProc
      read FProc write FProc;
    class var
      CurrPos: Integer; //current loop index
      MaxPos: Integer;  //max loops index
      cs: TCriticalSection;
      ThCount: Integer; //thread counter - how much threads have finished execution
  end;


{** ParallelFor Loop - all iterations will be performed in chosen threads
@param nMin - Loop min value (first iteration)
@param nMax - Loop max value (last iteration)
@param nThreads - how much threads to use
@param  aProc - anonymous procedure which will be performed in loop thread
}
procedure ParallelFor(nMin, nMax, nThreads: Integer; aProc: TParallelProc); overload;
{** ParallelFor Loop - all iterations will be performed in max cpu cores
@param nMin - Loop min value (first iteration)
@param nMax - Loop max value (last iteration)
@param  aProc - anonymous procedure which will be performed in loop thread
}
procedure ParallelFor(nMin, nMax: Integer; aProc: TParallelProc); overload;

implementation

uses
  {$IFDEF MSWINDOWS}
  Windows,
  {$ENDIF}
  SyncObjs;

procedure ParallelFor(nMin, nMax, nThreads: Integer; aProc: TParallelProc);
var
  threads: array of TParallel;
  I: Integer;
begin
  if nMin > nMax then
    Exit;
  // initialize TParallel class data
  TParallel.CurrPos := nMin;
  TParallel.MaxPos := nMax;
  TParallel.cs := TCriticalSection.Create;
  TParallel.ThCount := 0;

  // create the threads
  SetLength (threads, nThreads);
  for I := 0 to nThreads - 1 do
  begin
    threads[I] := TParallel.Create; // suspended
    threads[I].FThreadID := I;
    threads[I].Proc := aProc;
    threads[I].Start;
  end;

  for I := 0 to nThreads - 1 do
  begin
    threads[I].WaitFor;
  end;

  for I := 0 to nThreads - 1 do
  begin
    threads[I].Free;
  end;

  TParallel.cs.Free;
end;

procedure ParallelFor(nMin, nMax: Integer; aProc: TParallelProc);
begin
  ParallelFor(nMin, nMax, CPUCount, aProc);
end;

{ TParallel }

constructor TParallel.Create;
begin
  inherited Create(True); // suspended
  InterlockedIncrement(ThCount);
  FreeOnTerminate := False;
  FThreadID := 0;
end;

destructor TParallel.Destroy;
begin
  InterlockedDecrement(ThCount);
  inherited;
end;

procedure TParallel.Execute;
var
  nCurrent: Integer;
begin
  nCurrent := GetNextValue;
  while nCurrent <= MaxPos do
  begin
    Proc(nCurrent, FThreadID);
    nCurrent := GetNextValue;
  end;
end;

function TParallel.GetNextValue: Integer;
begin
  cs.Acquire;
  try
    Result := CurrPos;
    Inc(CurrPos);
  finally
    cs.Release;
  end;
end;

http://blog.csdn.net/zang141588761/article/details/51505360

 

以上是关于在delphi中如何用clientsocket进行实时发送。。即在数据库读取到数据就立即发送出去。。的主要内容,如果未能解决你的问题,请参考以下文章

Delphi中如何用IP地址的方式来连接Oracle数据库?

delphi中如何用finddialog实现对memo控件的查找

Delphi 200XXE中如何用并行实现循环的计算

在delphi中如何用combobox实现分级读取数据库中的内容

Keil中如何用Keil中如何用汇编调用C函数?

Delphi 如何用多线程进行数据采集