Delphi中线程调用主窗口变量的问题
在线程中有以下代码,在线程中调用主窗口的变量:seconds:=strtoint(MainForm.SendTime.Text);……加入这一段代码后,运行程序并调用线程...
在线程中有以下代码,在线程中调用主窗口的变量:
seconds:=strtoint(MainForm.SendTime.Text);……
加入这一段代码后,运行程序并调用线程,退出程序时会报错(如图)。去掉这一段代码就不会出错,请问怎样解决这一问题? 展开
seconds:=strtoint(MainForm.SendTime.Text);……
加入这一段代码后,运行程序并调用线程,退出程序时会报错(如图)。去掉这一段代码就不会出错,请问怎样解决这一问题? 展开
5个回答
展开全部
将SendTime.Text内容赋值给seconds是在线程中执行的
但不能保证主线程中对SendTime.text内容的修改,肯定会出错!
解决办法是使用Delphi自带的同步主线程的语句或使用SendMessage或PostMessage进行消息同步
但不能保证主线程中对SendTime.text内容的修改,肯定会出错!
解决办法是使用Delphi自带的同步主线程的语句或使用SendMessage或PostMessage进行消息同步
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在线程中,需要写一个同步方法,在方法中访问主线程的窗体资源。
procedure TMyThread.GetMainFormText;
begin
Seconds := StrToInt( MainForm.SendTime.Text );
end;
在线程的主逻辑体中写为Synchronize( GetMainFormText );
procedure TMyThread.GetMainFormText;
begin
Seconds := StrToInt( MainForm.SendTime.Text );
end;
在线程的主逻辑体中写为Synchronize( GetMainFormText );
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你在线程中调用主窗体的内容,退出时是不是没有关闭线程啊?这样的话当主窗体销毁,而线程没有终止时,调用主窗体的内容当然会报错了
追问
程序退出前线程已经通过thread.Terminate结束了
追答
是在Close里面做的吗?那样的话时间可能来不及,不知道你线程里面处理了多少事情,你可以通过输出日志的方式看一下,你的程序中究竟是线程先结束还是窗体先销毁。
解决的办法我没有试过,但是WaitForSingleObject应该可以解决,可以等待线程结束
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
简单的处理就是先判断一下MainForm是否存在
if Assigned(MainForm) then
seconds:=strtoint(MainForm.SendTime.Text);……
if Assigned(MainForm) then
seconds:=strtoint(MainForm.SendTime.Text);……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询