首页 > 其他分享 >lazarus 3.0/fpc3.3.1写线程要注意的事项

lazarus 3.0/fpc3.3.1写线程要注意的事项

时间:2024-02-07 09:11:58浏览次数:37  
标签:begin end Lines lazarus 线程 3.0 TThread 添加 procedure

近日和高勇交流中发现,以下代码在delphi能编译及正确执行。

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
    TThread.CreateAnonymousThread(
   procedure
   begin
     sleep(3000);
     TThread.Synchronize(TThread.CurrentThread,
     procedure
     begin
        Memo1.Lines.Add('okok');
     end);
   end
   ).Start;
end;

end.

但在lazarus 3.0/fpc 3.3.1时出现以下3种情况:
问题一:
编译时出现以下出错提示:

unit1.pas(137,4) Error: Illegal expression
unit1.pas(138,4) Error: Syntax error, ")" expected but "BEGIN" found

解决方法:
在单元最前面添加:
{$mode delphi}

{$mode DELPHI}{$H+}
unit Unit1;

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,LConvEncoding,

 

问题二:当加上{$mode delphi}后,编译时又出现另一错误:

unit1.pas(144,4) Error: Internal error 2022011001

这个提示“Error: Internal error 2022011001”没明确是那行编写有问题,最后发现是线程里Memo1.Lines.Add('okok')不能直接添加字符串,只能以变量添加才能通过编译。

procedure TForm1.Button4Click(Sender: TObject);
var i:integer;
  s:string;
begin
    TThread.CreateAnonymousThread(
   procedure
   begin
     sleep(3000);
     TThread.Synchronize(TThread.CurrentThread,
     procedure
     begin
       s:='okok';
       Memo1.Lines.Add(s);
     end);
   end
   ).Start;
end;

 
问题三:以上代码编译后在Windows能显示线程添加的信息,但linux可能不显示添加的信息。
我测试的结果是:在linux和windows都能显示添加的信息,但高勇的不能显示,最后发现在memo1.Lines.add(s)加上单元名就可以,如出现类似这情况,建议加上单元名称。
以下代码在windows和linux都能正确执行。

procedure TForm1.Button4Click(Sender: TObject);
var i:integer;
  s:string;
begin
    TThread.CreateAnonymousThread(
   procedure
   begin
     sleep(3000);
     TThread.Synchronize(TThread.CurrentThread,
     procedure
     begin
       s:='okok';
       Form1.Memo1.Lines.Add(s);
     end);
   end
   ).Start;
end;

 

标签:begin,end,Lines,lazarus,线程,3.0,TThread,添加,procedure
From: https://www.cnblogs.com/qiufeng2014/p/18010547

相关文章

  • 转载洛谷:23.08.19 普及模拟1 T1
    Past题目描述所有人,都有一段支离破碎的过去。你有\(n\)段过去的经历,有时顺利,有时不顺,于是你用一个评价值\(a_i\)来描述你的第\(i\)段经历,它们构成了长度为\(n\)的序列\(a\)。你决定对过去进行反思总结,反思深度为\(d\)。如果\(d\ge1\),那你就要算出\(a\)的所有子区间的和之和;如......
  • Oracle Version 19.3.0.0.0 On Windows Hyper-V Server 2019 Try In_Memory
    SQL*Plus:Release19.0.0.0.0-ProductiononTueFeb608:31:432024Version19.3.0.0.0Copyright(c)1982,2019,Oracle. Allrightsreserved.Enteruser-name:/assysdbaConnectedto:OracleDatabase19cStandardEdition2Release19.0.0.0.0-Produc......
  • Qt processEvents - 解决线程中事件阻塞(如槽函数被阻塞)
    百度了一会,发现没太有文字讲这件事情,因此整理成文字记录一下。processEvents介绍长时间运行的操作可以调用processEvents()保持应用程序响应能力。voidQCoreApplication::processEvents(QEventLoop::ProcessEventsFlagsflags=QEventLoop::AllEvents)根据指定的条件为调......
  • java 关于有序获取多线程的返回结果问题,按提交任务的顺序,收集执行结果
    问题:以前做的多线程,执行的返回结果都是无序的,所以每次执行完毕后还要对结果集重新进行排序,增加了耗时; 今天突然想到一个思路,在给线程池提交任务的时候,可以提前获取任务总数,创建一个用于接收结果集的固定大小list2,然后子线程执行的时候把当前任务序号传进去,处理好数据后根据序号......
  • 深入浅出Java多线程(九):synchronized与锁
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第九篇内容:synchronized与锁。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代软件开发中,多线程技术是提升系统性能和并发能力的关键手段之一。Java作为主流的编程语言,其内置的多线程机制为开发者......
  • JAVA线程池
    线程池中的四种拒绝策略通常是指:AbortPolicy(默认策略):这是默认的拒绝策略。当线程池无法接受新任务时,它会抛出RejectedExecutionException异常。CallerRunsPolicy:在这种策略下,当线程池无法接受新任务时,会使用提交任务的线程来执行该任务。这样做的目的是为了降低新任务的提交......
  • C#多线程编程的Task(任务全面解析)
    原文链接:https://www.cnblogs.com/xietianjiao/p/7429742.htmlTask是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程。 我们可以说Task是一种基于任务的编程模型。它与thread的主要区别是,它更加方便......
  • WINAPI 线程创建简单测试
    #include"Windows.h"#include<stdlib.h>#include<stdio.h>DWORDWINAPIThreadFunc(LPVOIDparam){printf("启动线程\n");return0;}intmain(){DWORDthreadID=0;HANDLEthreadObj=NULL;threadObj=......
  • 深入浅出Java多线程(十):CAS
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十篇内容:CAS。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在多线程编程中,对共享资源的安全访问和同步控制是至关重要的。传统的锁机制,如synchronized关键字和ReentrantLock等,能够有效防止多个线程同时......
  • 深入浅出Java多线程(八):volatile
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第八篇内容:volatile。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在当今的软件开发领域,多线程编程已经成为提高系统性能和响应速度的重要手段。Java作为广泛应用的多线程支持语言,其内存模型(JMM)设计......