flshlion 2021-12-28 15:51 采纳率: 100%
浏览 53
已结题

delphi 多线程处理字符串不能并行的问题

用Delphi写了一个程序,尝试用2条以上线程并行计算以提高速度,发现真正运行时基本上是串行,只使用CPU一个核心。排查了很久,全局变量,VCL访问全部排除,最后发现是字符串处理函数(Midstr)的问题,再深入尝试发现是COPY函数的问题。
做了一个简例,代码如下:

procedure incedit1; // 线程 1
var
  s: string;
begin
  while True do
  begin
    s := copy('tretryjtrry', 1, 5);
  end;
end;

procedure incedit2; // 线程 2
var
  s: string;
begin
  while True do
  begin
    s := copy('hjkghjgjhrry', 2, 6);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  th1,th2: cardinal; // 卡迪纳尔 无符号整型
  h1,h2: integer; // ZN 质数数量 K 基准测试判断
begin
  h1 := beginthread(nil, 1024, @incedit1, nil, 0, th1);
  h2 := beginthread(nil, 1024, @incedit2, nil, 0, th2);
end;

只要两条线程都用了COPY函数,运行时CPU就只用到1个核心,只要将其中一线程内容去除Copy,就能两条线程同时运行,利用到两个核心。
请问有没有办法充分利用CPU? 试过用Byte Array代替String处理,一样的只能使用一个核心。

刚刚用Lazarus与VB.NET试了一下,没有任何问题,反而Delphi不行,奇怪。

望赐教!感谢。

  • 写回答

2条回答 默认 最新

  • 墨梅无痕 2021-12-30 12:03
    关注

    这可能与内存管理有关。
    用System.StrMove,System.StrCopy试试,还有 System.MoveChars。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 修改了问题 12月28日
  • 修改了问题 12月28日
  • 展开全部

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格