关于线程与主程序之前怎样传送数据对象
一个主程序(界面程序);二个线程,线程中处理出来的数据需要在主程序界面listview上显示;但又不能在线程中直接给主程序中的listview各项赋值显示出来(现在是这样作的,程序经常挂,一般二三天左右),讲在线程中只进行数据的加载,先定义一个数据对象,保存一行的数据如
TMyItem=class
Caption:String;
Column1:String;
Column2:String;
end;
但这个数据我不知怎样才能发送到主程序,主程序应当是怎样接收(并怎样触发并显示在listview表中),从来没有作过,网上也没有完整的样例(找了二天了)。在此是否还有更好的解决办法,如果只是此办法最好或最为普遍,麻烦那个能给一个完整的代码。
[解决办法]
有两种方式实现:
一、
1、在DataModuel模块定义一个TMyItem=class这人类。
2、线程中给TMyItem赋值,然后发送消息到主窗体,主体接收消息显示即可。
说明:其实就是把DataModeul当做一个中间通讯模块。因为DataModeul在线程中也是可以访问的!
二、把主界面中的ListView在创建线程时当做参数传递到线程中,然后直接操作就可以了。实际上第一个方法中需要发消息,主窗体的句柄也需使用参数传递进去。
[解决办法]
最简单的方法。
全局TMyItem变量(应该是数组吧?不止一个)。
比如:
var
item:TMyItem;
begin
修改后,PostMessage(MainForm.Handle,111,222,Integer(item));
end;
MainForm 收到 111 消息后,将 LParam 转换成 TMyItem,
然后显示去吧。
安全的做法:
修改,添加 TMyItem 的时候加临界区锁保护一下。
MainForm 收到修改消息后,用同一个临界区取出显示。
[解决办法]
同意3楼,要访问的对象必须是全局的,同时将此对象的地址通过发送消息传递给线程,或者线程直接访问此全局对象也可以。但是须要注意的是,数据并发的情况。
[解决办法]
同意三楼,加临界区可以避免资源冲突的问题!
[解决办法]
通过全局变量方式,当然前面有人讲过了,要用临界区
还有一种方式是用同步方法
你想作的就是线程同步,其实线程同步有很多方法,比如临办区,互斥,信号,事件方式等,很多种
[解决办法]
TMyItem定义为全局对象,就可以在界面访问了
你这个问题应该是解决在线程中访问listview吧,不然数据不能保证同步显示啊,运行两三就挂掉,现在最主要问题应该是找出内存泄漏的原因。
线程中是可以直接访问的Listview的,注意临界区
[解决办法]
数据设为全局变量,然后不管是主线程还是工作线程访问数据的时候用临界区或互斥保护。
将工作线程中的数据传送到主线程的想法是做梦。会要了你的命。
建议有时间看看《Win32多线程程序设计》,候捷翻译的哪本。不要怕麻烦,多线程不是几天就能掌握的,我的经验把多线程掌握至少也要有项目锻炼个一,二年吧。
[解决办法]
传递的数据还是直接采用全局指针吧, 不要用对象, 用 PostMessage 把指针传给主线程的消息窗口