请教一个共享文件的问题 |
尚未結案
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
查了一天资料,想实现两个进程之间的数据共享,最后用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 發送簡訊給我 |
查找了别人的文章, 发现共享记忆体的方式很多, 快而且简单。但我有个疑问,我目前的程序框架大概如下
{对于发送方} 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 發送簡訊給我 |
建议采用内存映射文件 消息的方式来处理即可。
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 發送簡訊給我 |
引言: 建议采用内存映射文件 消息的方式来处理即可。 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 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
|
Kingron
中階會員 發表:1 回覆:51 積分:60 註冊:2005-09-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |