如何在线程内访问主程序中的全局变量和memo控件(200分)

  • 主题发起人 主题发起人 softgold
  • 开始时间 开始时间
S

softgold

Unregistered / Unconfirmed
GUEST, unregistred user!
在窗体form1的代码文件unit1中有一函数myThread, 在事件commandButton1Click中,
用Win API的createThread创建该函数的多个线程.
然后在线程内部读写主程序中的全局变量i, 读写form1中的memo控件的内容
我是直接读写的, 例如: i:=12;
form1.memo.lines.add('aaa');
创建的现程已经能够正常运行, 读写也能实现, 只是几个线程同时访问这些变量和控件,
导致了冲突的发生, 写入的结果是不正确的.
在保证线程运行效率的前提下, 应该用那种方式来实现多线程安全读写这些变量和控件
谢谢
 
写一个函数,用异步访问阿,好像是一个syn...()
 
用 Synchronize 进行同步控件。
This example shows how to call a button抯 click method in a thread-safe manner:
procedure TMyThread.PushTheButton;
begin
Button1.Click();
end;

procedure TMyThread.Execute;
begin
...
Synchronize(PushTheButton);
...
end;
 
to: devecom
异步方式是通过向主程序发送消息吗, 访问变量和控件都可以这样做吗
我的程序中, 每个线程都访问了控件memo的不同行的数据
具体怎么实现呢, 能说详细一点吗
To: jsxjd
你说的是在TThread对象中的实现方式, 不适用于 createThread创建的线程吧
 
Synchronize是TThread的成员
用同步对象守护所有线程的共用资源,Critical Section Objects, Event Object,等等。
这些是Windows系统的对象,VCL有封装好的TCriticalSection 和TEvent,VCL库中的SeverSocket
就一个多线程的组件,它用了CriticalSection同步每个线程。
 
如果是你说的那项,最好用消息,线程给住程序PostMessage
 
To: spidertong
你能介绍一下Synchronize,Critical Section Objects, Event Object这几种方法的优劣和适用范围吗?
或者介绍一下在网上哪里可以学习到这些知识,谢谢
我也不想过多的麻烦大家了,只要能找到大致的思路,我就想结束此次讨论了
还望大家在帮助一把,谢谢
 
有一本 Delphi技术手册,有介绍,不错的
 
delphi 技术内幕 一书有介绍 多线程的 东东
 
谢谢大家的参与,我已经找到这两本书,我再好好学学吧。大家分分儿吧,都有份儿,哈哈,谢谢大家!
 
后退
顶部