多线程显示的问题

秋天之落叶 2018-04-15 08:21:29
开始学习线程,看了网上的教程,凑了一个简单的程序,有一奇怪的问题请教:
TMyThead = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

procedure TMyThead.Execute;
begin
for m := 0 to 20000 do // m全局变量
begin
Form6.Edit2.text := m.ToString; //行1
Form6.Memo1.Lines.Add(m.tostring); //行2
end;
end;

procedure TForm6.Button1Click(Sender: TObject);
begin
for n := 0 to 20000 do // n全局变量
begin
Edit1.text := n.ToString;
Application.ProcessMessages;
end;
end;

procedure TForm6.Button2Click(Sender: TObject);
var
MyThread: TMyThead;
begin
MyThread := TMyThead.Create(False);
end;

TMyThead.Execute中
仅使用 //行1 就会出现错误:First chance exception at $6ED66231. Exception class $C0000005 with message 'access violation at 0x6ed66231: read of address 0x00000000'. Process Project5.exe (5996)
仅使用 //行2,一切正常;
同时使用 //行1和//行2,一切正常。
这个问题对我来说很是奇怪,有请高手解惑。
...全文
339 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋天之落叶 2018-04-16
  • 打赏
  • 举报
回复
引用 3 楼 lyhoo163 的回复:
1、线程中,不能对VCL控件进行操作。对Edit赋值是行不能的。 2、线程中,显示信息,通过发送消息方式推送。 3、可以使用StaticText:

     S:='下载('+IntToStr(KAll)+'): '+IntToStr(L)+'% -> '+IntToStr(K)+'/'+IntToStr(KK)+' '+sFileName+'  ......';
      StaticText1.Width:=427;
      SendMessage(StaticText1.handle, WM_SETTEXT, 0, LPARAM(S));
      application.ProcessMessages;
追问一句:为什么同时使用 //行1和//行2,一切正常。
秋天之落叶 2018-04-16
  • 打赏
  • 举报
回复
引用 3 楼 lyhoo163 的回复:
1、线程中,不能对VCL控件进行操作。对Edit赋值是行不能的。 2、线程中,显示信息,通过发送消息方式推送。 3、可以使用StaticText:

     S:='下载('+IntToStr(KAll)+'): '+IntToStr(L)+'% -> '+IntToStr(K)+'/'+IntToStr(KK)+' '+sFileName+'  ......';
      StaticText1.Width:=427;
      SendMessage(StaticText1.handle, WM_SETTEXT, 0, LPARAM(S));
      application.ProcessMessages;
哦哦哦,受教了,多谢!
lyhoo163 2018-04-16
  • 打赏
  • 举报
回复
1、线程中,不能对VCL控件进行操作。对Edit赋值是行不能的。 2、线程中,显示信息,通过发送消息方式推送。 3、可以使用StaticText:

     S:='下载('+IntToStr(KAll)+'): '+IntToStr(L)+'% -> '+IntToStr(K)+'/'+IntToStr(KK)+' '+sFileName+'  ......';
      StaticText1.Width:=427;
      SendMessage(StaticText1.handle, WM_SETTEXT, 0, LPARAM(S));
      application.ProcessMessages;
秋天之落叶 2018-04-15
  • 打赏
  • 举报
回复
procedure TMyThead.Execute; begin inherited; Synchronize(uc); end; procedure TMyThead.uc; var i: integer; begin for m := 0 to 20000 do begin i := m; Form6.Edit2.text := i.ToString; Application.ProcessMessages; end; end; 改成这样吗?这样在按线程时主线程就会停止了。
pilotage 2018-04-15
  • 打赏
  • 举报
回复
线程访问窗口要用 Synchronize

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧