【问题标题】:delphi simulate fifo with TStringListdelphi用TStringList模拟fifo
【发布时间】:2020-05-01 13:06:30
【问题描述】:

我需要处理从 tcp 链路接收到的数据。数据是 203 字节长度的十六进制字符串帧。

我将它们保存在 tstringlist 的末尾

MyList.Add( input );

从第二个线程读取第一个字符串并处理它并从列表中删除 firs

procedure TMyThread.Execute;
 var str : string;
begin
    while not Terminated do
    begin
      FTermEvent.WaitFor(100);
      if not Terminated then
      begin
          str := MyList[0];     
          MyList.Delete(0);
          //some process
      end;
    end
end;

问题是,这个线程安全吗?!

【问题讨论】:

  • 抛开线程方面的考虑,使用TQueue<string> 而不是TStringList 会更有效。
  • 小吹牛,不要用字符串存储二进制数据...
  • 请阅读这篇优秀的primer on threading。你所拥有的是一个典型的生产者/消费者案例......
  • 为什么,为什么要将二进制数据存储为十六进制文本?

标签: delphi


【解决方案1】:

如果您害怕使用数据库丢失输入数据,您可以尝试使用 TThreadStringList。 我想您的软件同时从多个设备接收数据(在这种情况下,您应该创建一个多线程 socked 以确保您确保接收所有数据)如果您从单个设备接收数据,您应该确保tcp 协议支持一种确认系统,以避免丢失数据或至少在日志中报告您的应用程序无法完全接收的数据。

无论如何,TThreadStringList 是 TStringList 的简单包装器。 它应该可以从不同的线程访问字符串列表而不会发生任何冲突。 我无法对其进行测试,但您应该可以轻松快速地尝试。

链接: TThreadStringList

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2012-12-05
    相关资源
    最近更新 更多