近日和高勇交流中发现,以下代码在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;