这有很多方法,你可以在线程里面写个方法,方法里面的代码恰好是控件事件里面的代码就行啦,然后在线程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)。
1.解决多线程冲突:唯灶
定义一个对象A,指陵扮类型为TCriticalSection;
进入临界区:A.Enter;离开:A.Leave;
2.多线程使用主窗汪物口的事件,直接向主窗口控件发送事件即可;为了安全起见,定义一个过程ProcAAA,将发送事件的代码在该过程中实现,在线程中用Synchronize(ProcAAA)即可。
使用线程的时候,遇到的一个基本的问题,就是多个线程访问同
一个对象,比如访问相同的文件、DLL、相同的通讯资源,特别是数
据库的访问,当多个线程对同一数据库字段写入的时候,其结果会此液出
现不确定性。汪扒滚
临界区用于解决这个问题,它可以保证困余线程使用敏感数据的时候,
阻赛其他的线程访问名干数据,使用时首先要初始化,其声明一个
TRTLCriticalSection类型的变量:
var
CS:TRTLCriticalSection;
初始化:
initializeCriticalSection(cs);
独占
线程中的代码先
EnterCriticalSection(cs);
********************************************
在这儿写调用主窗口控件的代码就行了
*********************************************
后解除独占
LeaveCriticalSection(CS);
在开发散橘IE插件时,如何将自己的插件功能嵌入IE右键便捷菜单中得以实现?打开BitComet程序的选项,巧掘塌点击左侧“任孝圆务设置”中的“Http/Ftp下载”
把主窗口单元的控件事件设置为public就可以了