線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1592
推到 Plurk!
推到 Facebook!

请教一个共享文件的问题

尚未結案
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-07 01:13:06 IP:211.147.xxx.xxx 未訂閱
查了一天资料,想实现两个进程之间的数据共享,最后用win32api的CreateFile, LockFile及UnLockFile来实现。我的要求是进程A每隔一段时间生成一定数量的数据,先锁住文件T,然后将数据写入文件T中,B进程不段监控T,如果A解锁则B立即锁住T,然后读取文件,如此往复使得A和B可以交换数据。但我的一组数据量约为700000个字节,约每隔十移产生一组新数据,而这些数据每次都由文件头开始写,所以文件不会不断增大。可是这样的数据量太大了,其实进程A计算一组数的时间是极快的,但由于A与B都要监控文件T,所以效率会很低。现在每交换一次几乎要30秒左右。我想请问各位几个问题 1)能否直接在进程间传送数据?如果可以700000数据会很花时间吗?怎样实现呢? 2)如果1)是否,但我在进程A中调出进程B,这样它们之间可以共享数据吗?怎样实现呢? 谢谢
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-07 02:20:51 IP:211.147.xxx.xxx 未訂閱
查找了别人的文章, 发现共享记忆体的方式很多, 快而且简单。但我有个疑问,我目前的程序框架大概如下
 
  {对于发送方}
  CreateFileMapping(...);
  MapViewOfFile(...);           
  ...
  CopyMemory(...);
  UnmapViewOfFile(...);
  CloseHandle(...);
 
  {对于接收方}
  OpenFileMapping(...);   
  MapViewOfFile(...);  
  ...
  UnmapViewOfFile(...);
  CloseHandle(...);
这些代码执行很顺利,对于我的数据量,不到一秒就传送完成了。但我的两个process 是不断在做别的工作的。请问CreateFilemapping及Openfilemapping是否在process 结束前只需要调动一次即可?还是要每次交换数据时都要调用一次?另外,怎样才能使两个process 交换数据同步?(即process A将数据写到mapping中后要等到process B完全从mapping中取走数据后才能继续工作) 另外,上述代码都是用C 语言写的测试时没问题。我想转到Delphi上,其它代码好办,但是 MapViewOfFile 不好办, 我的数据都是 double 型,我转换时我参照其它程序写了以下代码 code] pBuf = ^TData; TData = array [0..DATANUM] of Double; ... pBuf := MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, MAXBYTES); 但编译时总出错,后来我又改了代码
 
  pBuf  :PDouble;      ...
  pBuf := MapViewOfFile(hMapFile,
                        FILE_MAP_ALL_ACCESS,
                        0,
                        0,
                        MAXBYTES);      a := pBuf^;
  Inc(pBuf); b:=pBuf^;
[/code]
这次编译成功,但运行时出错,错误应该是由pBuf^引起的。请各位帮忙看看    發表人 - mchakuna 於 2005/10/07  03:48:00
        
Kingron
中階會員


發表:1
回覆:51
積分:60
註冊:2005-09-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-07 21:44:45 IP:61.145.xxx.xxx 未訂閱
建议采用内存映射文件 消息的方式来处理即可。 A程序: 启动时开一个共享内存块,可以使用内存映射文件,生成内存指针为P。 在数据生成后,记录数据大小Size,发送消息SendMessage(B.Handle,CM_DATA, Size,0); B程序: 启动时打开共享内存块,获取内存指针P。 在收到CM_DATA消息后,进行处理即可。 这样没有Lock,无需监控,无需不断Open/Close,如果A程序需要立即返回,则使用PostMessage代替SendMessage即可,不过如果使用同一个缓冲区,则需要使用临界区!
------
超级猛料:http://kingron.delphibbs.com
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-07 22:40:43 IP:211.147.xxx.xxx 未訂閱
引言: 建议采用内存映射文件 消息的方式来处理即可。 A程序: 启动时开一个共享内存块,可以使用内存映射文件,生成内存指针为P。 在数据生成后,记录数据大小Size,发送消息SendMessage(B.Handle,CM_DATA, Size,0); B程序: 启动时打开共享内存块,获取内存指针P。 在收到CM_DATA消息后,进行处理即可。 这样没有Lock,无需监控,无需不断Open/Close,如果A程序需要立即返回,则使用PostMessage代替SendMessage即可,不过如果使用同一个缓冲区,则需要使用临界区!
谢谢, 已按照你的建议实现了, 在Delphi上实现的确可以。但最大的问题是,我其中一个进程是纯C程序而且是console program,它可以用winapi来发送WM_DATA, 但无法监控和接收消息,而这个C程序由于某种原因不想改成Delphi的,所以很头痛。
Kingron
中階會員


發表:1
回覆:51
積分:60
註冊:2005-09-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-08 10:03:39 IP:61.145.xxx.xxx 未訂閱
如果C程序是A程序的话,一样可以采取我的方式实现。 但是如果C程序实现的是B的功能的话,那么只有采取其他方式来实现了。如果方便,可以直接修改C程序的代码,增加一个消息处理,其实代码也不过10来行,做起来也简单。
------
超级猛料:http://kingron.delphibbs.com
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-08 19:50:45 IP:211.147.xxx.xxx 未訂閱
引言: 如果C程序是A程序的话,一样可以采取我的方式实现。 但是如果C程序实现的是B的功能的话,那么只有采取其他方式来实现了。如果方便,可以直接修改C程序的代码,增加一个消息处理,其实代码也不过10来行,做起来也简单。
C语言程序中也要收发消息, 收消息简单, 但我的程序是console program, 怎样能接受消息?
Kingron
中階會員


發表:1
回覆:51
積分:60
註冊:2005-09-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-17 23:40:36 IP:218.13.xxx.xxx 未訂閱
控制台程序一样可以有窗体,有消息循环,不要被蒙蔽了,只要AllocWindowHandle即可进行消息处理。
------
超级猛料:http://kingron.delphibbs.com
系統時間:2024-05-06 20:20:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!