当前位置:主页>仓库管理软件> 列表

文件读写同步问题 找进销存软件破解版

财务软件版1楼: C盘下有一A的文本文件
c:\a.txt
有两个线程同时对它操作。
一个在往里写(调其他程序)。另外一个等前面的线程写完后去读。
如何能够知道前面的写完了?时间因为写的内容不同写的时间从几秒到几十秒不等。
如何知道已经写完马上读?
用文件流 ms:tfilestream 监视可以吗?
我用 ms.Create(''c:\a.txt'',fmOpenWrite ) ;当a.txt变化时ms会变化吗?
现在是用sleep(60000);可是有时候一秒不到就写完了。白白多等了59秒。有没有API函数
能够马上得知a.txt的变化?问题解决再加300分

2楼: {在写文件进程中,如果完成操作,那么触发读文件进程的读文件的事件;
就像TEdit 的内容变化后会触发其OnChange 属性中设置的事件一样!}

unit ClassThreads;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms;

type
TReadThread = class (TThread)//读进程,里面有个读文件的事件
public
procedure Read(Sender : TObject);
end;

TWriteThread = class (TThread)//写进程,有写事件
private
FReadEvent: TNotifyEvent;
public
constructor Create(CreateSuspended: Boolean; AReadEvent : TNotifyEvent); reintroduce; overload;
property ReadEvent : TNotifyEvent read FReadEvent write FReadEvent;//读文件的事件属性,初始化的时候,或者其它时候可以给该属性赋值
procedure Write(Sender : TObject);
end;

procedure Run;

implementation

procedure Run;
// 使用范例
var
r : TReadThread;
w : TWriteThread;
begin
r := TReadThread.Create(True);
w := TWriteThread.Create(True, r.Read);
//...........
end;

{ TReadThread }

procedure TReadThread.Read(Sender: TObject);
begin
//
end;

{ TWriteThread }

constructor TWriteThread.Create(CreateSuspended: Boolean; AReadEvent : TNotifyEvent);
begin
inherited Create(CreateSuspended);
if Assigned(AReadEvent) then
ReadEvent := AReadEvent;
end;

procedure TWriteThread.Write(Sender: TObject);
begin
//处理写文件..............

//写文件完毕后,触发读事件
if Assigned(ReadEvent) then
ReadEvent(nil);
end;

end. 如进销存软件破解版

3楼: To royal1442
[:D]难就难在写不在本进程中。是线程通过消息通知另外一个进程(另外的程序写。并且不是我的程序不能发消息通知我。只知道他收到消息后会马上写a.txt文件。也不知道他什么时间写完)。同一进程中用你的代码很容易实现。谢谢了。不同进程是不是监视a.txt文件?好像很有难度啊。

[red]有没有朋友知道?[/red]

4楼: 那就不好办了,除非它可以通过任意一种方式来通知你!

5楼: 可以使用互斥。典型的进程同步问题

6楼: 进程间的同步只能用互斥量
CreateMutex
OpenMutex
WaitForSingleObject
CloseHandle
ReleaseMutex
就这几个函数

财务软件版7楼: 比较两次读的同不同,不知中不中?或是文件属性中的各种时间(最后一次修改之类的)

8楼: 多人接受答案了。