請教富翁們在多線程中,?各個線程能同時去訪問主界面的控件嗎(10分)

  • 主题发起人 主题发起人 gemmy
  • 开始时间 开始时间
G

gemmy

Unregistered / Unconfirmed
GUEST, unregistred user!
比如,每個線程都要訪問主界面的stringGrid控件但不對它進行編寫
 
可以,在线程类的保护方法里读VCL控件,
 
是在synchronize 中嗎
 
可以在線程中這樣訪問嗎
GetGridColRow(formServerMain.SelectCondGrid.Cells[2,i],formServerMain.SelectCondGrid.Cells[0,i],formServerMain.SelectCondGrid.Cells[1,i],RecordCount);
 
用synchronize()方法来
这个方法会做一些工作,把传入的方法交由主线程来执行
 
不用synchronize()方法可以去訪問主界面的控件嗎
 
謝了各位
 
再問一下
如果用synchronize()方法,我多個線程都這樣做
那麼這幾個線程都是同步執行的嗎
 
gemmy, 别急揭帖,
我也顺便问问!
各位大哥!
比如我的主窗体中有个OLE Container, 我可以创建线程去读数据库,
然后将数据库返回的值读到OLE中,这可以实现吗?给我肯定的回答!
可以或不可以!谢谢!
 
gemmy,
我正在看的《delphi in a nutshell》中的一段代码显示(P117),是可以这么做的!
比如并行打印,可以有:
begin
Synchronize(PrintHeader);
Synchronize(PrintFooter);
end;
意即:并行打印文档页头和页脚!
 
有关线程,我谈点看法。
对于大多数非可视控件,线程可以并行安全操作。读写Canvas的VCL通过锁定Canvas来实现
多线程的访问,但是事实上一个线程在访问的时候,另一个线程处于等待状态。实现这种
访问的控制并不需要通过Synchrinize来实现,而是Canvas自己带一个同步对象,实现重入
限制。Synchrinize只能保证同类型的多个实例不会同时执行某个过程,并不能实现多个不
同类线程间的同步控制。
数据库访问应该尽可能避免在线程中访问。Delphi中的TDataset并不是线程安全的,它对
线程的限制比VCL还严格。所以大多数数据库引擎中自己带有同步机制,保证多线程间的同
步。不过,大家知道,应用程序消息循环总是单线程的,基于这个原因,我总是直接通过
消息来同步,又方便又安全。如果是要求即时应答,线程通过SendMessage向父窗口发送消
息,否则通过PostMessage向父窗口发送消息,这样,线程通过PeekMessage循环获得父窗
口返回的消息,必要时还可以在线程中加入事件机制实现线程安全。
 
在<DELPHI技术手册>中有比较清楚的说明。
我一时也想不完整
意思就是Synchronize是一个黑箱
由Synchronize()传入的过程会由一个什么操作来发送到
主线程中来执行。
所以:
>如果用synchronize()方法,我多個線程都這樣做
>那麼這幾個線程都是同步執行的嗎
还是有一定的执行顺序的。
在<D5开发人员指南>上也有说明!
 
非常赞同barton的看法,对界面控件和非界面控件的交互部分最好使用消息驱动的方式,使用多线程访问界面你不是绝对的高手,你是难以驾驭的。而且通常你那样做反而容易破坏程序良好的结构,导致界面部分和下面捆的很紧。
 
后退
顶部