delphi 中 怎么做线程单元里调用主窗口单元的控件事件 给个例子····
5个回答
展开全部
这有很多方法,你可以在线程里面写个方法,方法里面的代码恰好是控件事件里面的代码就行啦,然后在线程run里面调用。但是如果窗口中的控件事件涉及到界面的刷新,则不应该在线程中调用,应该由线程发送一个消息给窗口,窗口捕获到该消息后,调用相应控件的事件。下面是我的部分代码,可一参考:
ShowCollectDataFrm.fShowTxt := '正在采集'+DataCollectFrm.fSelDevicer[i].TypeName+
'['+DataCollectFrm.fSelDevicer[i].ModelID+']'+'的数据,请稍候...';
PostMessage(ShowCollectDataFrm.Handle,WM_ThreadChangeMsg,Self.ThreadID,0);
这两句代码是在线程的run里面,是指线程运行到这里要更新窗口的提示信息,则发送一个消息到ShowCollectDataFrm,消息定义为WM_ThreadChangMsg。
const
WM_ThreadChangeMsg = WM_USER + 20;
这是在主窗体中定义的消息常量
procedure ThreadChange(var AMessage: TMessage);Message WM_ThreadChangeMsg;
这是捕获消息的方法的定义,他是回调函数,不需要手动调用
procedure TShowCollectDataFrm.ThreadChange(var AMessage: TMessage);
begin
if fCollectThreadID = Cardinal(AMessage.WParam) then
begin
Application.ProcessMessages;
lblShowTxt.Caption := fShowTxt; //更改提示文字
Application.ProcessMessages;
end;
end;
这是捕获到消息后的处理,你可以把里面改成你要调用的控件的事件,如:btnStopClick(nil)。
ShowCollectDataFrm.fShowTxt := '正在采集'+DataCollectFrm.fSelDevicer[i].TypeName+
'['+DataCollectFrm.fSelDevicer[i].ModelID+']'+'的数据,请稍候...';
PostMessage(ShowCollectDataFrm.Handle,WM_ThreadChangeMsg,Self.ThreadID,0);
这两句代码是在线程的run里面,是指线程运行到这里要更新窗口的提示信息,则发送一个消息到ShowCollectDataFrm,消息定义为WM_ThreadChangMsg。
const
WM_ThreadChangeMsg = WM_USER + 20;
这是在主窗体中定义的消息常量
procedure ThreadChange(var AMessage: TMessage);Message WM_ThreadChangeMsg;
这是捕获消息的方法的定义,他是回调函数,不需要手动调用
procedure TShowCollectDataFrm.ThreadChange(var AMessage: TMessage);
begin
if fCollectThreadID = Cardinal(AMessage.WParam) then
begin
Application.ProcessMessages;
lblShowTxt.Caption := fShowTxt; //更改提示文字
Application.ProcessMessages;
end;
end;
这是捕获到消息后的处理,你可以把里面改成你要调用的控件的事件,如:btnStopClick(nil)。
展开全部
1.解决多线程冲突:
定义一个对象A,类型为TCriticalSection;
进入临界区:A.Enter;离开:A.Leave;
2.多线程使用主窗口的事件,直接向主窗口控件发送事件即可;为了安全起见,定义一个过程ProcAAA,将发送事件的代码在该过程中实现,在线程中用Synchronize(ProcAAA)即可。
定义一个对象A,类型为TCriticalSection;
进入临界区:A.Enter;离开:A.Leave;
2.多线程使用主窗口的事件,直接向主窗口控件发送事件即可;为了安全起见,定义一个过程ProcAAA,将发送事件的代码在该过程中实现,在线程中用Synchronize(ProcAAA)即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用线程的时候,遇到的一个基本的问题,就是多个线程访问同
一个对象,比如访问相同的文件、DLL、相同的通讯资源,特别是数
据库的访问,当多个线程对同一数据库字段写入的时候,其结果会出
现不确定性。
临界区用于解决这个问题,它可以保证线程使用敏感数据的时候,
阻赛其他的线程访问名干数据,使用时首先要初始化,其声明一个
TRTLCriticalSection类型的变量:
var
CS:TRTLCriticalSection;
初始化:
initializeCriticalSection(cs);
独占
线程中的代码先
EnterCriticalSection(cs);
********************************************
在这儿写调用主窗口控件的代码就行了
*********************************************
后解除独占
LeaveCriticalSection(CS);
一个对象,比如访问相同的文件、DLL、相同的通讯资源,特别是数
据库的访问,当多个线程对同一数据库字段写入的时候,其结果会出
现不确定性。
临界区用于解决这个问题,它可以保证线程使用敏感数据的时候,
阻赛其他的线程访问名干数据,使用时首先要初始化,其声明一个
TRTLCriticalSection类型的变量:
var
CS:TRTLCriticalSection;
初始化:
initializeCriticalSection(cs);
独占
线程中的代码先
EnterCriticalSection(cs);
********************************************
在这儿写调用主窗口控件的代码就行了
*********************************************
后解除独占
LeaveCriticalSection(CS);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在开发IE插件时,如何将自己的插件功能嵌入IE右键便捷菜单中得以实现?打开BitComet程序的选项,点击左侧“任务设置”中的“Http/Ftp下载”
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把主窗口单元的控件事件设置为public就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询