zoukankan      html  css  js  c++  java
  • TList实现的任务队列

    TList实现的任务队列

    var
    g_tasks: TList;

    type
    PTRecvPack = ^TRecvPack;

    TRecvPack = record // 接收到的原数据
    socket: TCustomWinSocket;
    data: AnsiString;
    end;

    procedure TForm1.ssocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
    Pack: AnsiString;
    pRecvPack: PTRecvPack;
    begin
    try
    // 接收数据
    FData := FData + Socket.ReceiveText;
    // 处理粘包
    while Pos(TAILCHAR, FData) > 0 do
    begin
    // 取一个完整的数据包
    FData := ArrestStringEx(FData, HEADCHAR, TAILCHAR, Pack);
    // 加入任务队列
    New(pRecvPack);
    pRecvPack^.socket := Socket;
    pRecvPack^.data := Pack;
    g_tasks.Add(pRecvPack);
    end;
    except
    on e: Exception do
    WriteLog('TForm1.ssocketClientRead ' + e.Message);
    end;
    end;

    procedure TWorkerThread.Execute;
    var
    pRecvPack: PTRecvPack;
    pDecodePack: PTDecodePack;
    len: Integer;
    begin
    inherited;
    try
    while not Self.Terminated do
    begin
    Sleep(1);
    // 取一个数据包 从队列
    g_tasks.Lock;
    try
    if g_tasks.Count = 0 then
    Continue;
    pRecvPack := g_tasks.Items[0];
    g_tasks.Delete(0);
    finally
    g_tasks.UnLock;
    end;
    // 开始解码
    New(pDecodePack);
    pDecodePack^.socket := pRecvPack^.socket;
    // 解码包头
    pDecodePack^.msgHead := DecodeMessage(LeftStr(pRecvPack^.data, DEFBLOCKSIZE));
    // 解码包体 如有
    len := Length(pRecvPack^.data);
    if len > DEFBLOCKSIZE then
    pDecodePack^.msgBody := DecodeString(RightStr(pRecvPack^.data, len - DEFBLOCKSIZE));
    // 释放指针
    if pRecvPack <> nil then
    Dispose(pRecvPack);
    // 处理消息 开始
    case pDecodePack^.msgHead.MsgID of
    CM_LOGIN:
    Self.login(pDecodePack);
    CM_PASSWORD:
    Self.password(pDecodePack);
    CM_CTOC:
    Self.cToc(pDecodePack);
    // CM_QRY:

    end;
    // 释放指针
    if pDecodePack <> nil then
    Dispose(pDecodePack);
    end;
    except
    on e: Exception do
    WriteLog('TWorkerThread.Execute ' + e.Message);
    end;
    end;

  • 相关阅读:
    Strus2第一次课:dom4j操作xml
    Strus2第一次课:dom4j解析xml文档
    2014最后一天,好烦!这个问题从来没遇到过!网上查找了很多办法都没解决!并且no wifi 了!
    MyBatis 入门(一)
    RSA学习记录
    [HCTF 2018]admin学习记录
    [HDCTF2019]together
    BUUCTF刷题记录REAL类
    BUUCTF刷题记录————unencode
    实验四
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/5864444.html
Copyright © 2011-2022 走看看