文件读写同步问题(50分)

  • 主题发起人 主题发起人 网中戏
  • 开始时间 开始时间

网中戏

Unregistered / Unconfirmed
GUEST, unregistred user!
C盘下有一A的文本文件<br>c:/a.txt<br>有两个线程同时对它操作。<br>一个在往里写(调其他程序)。另外一个等前面的线程写完后去读。<br>如何能够知道前面的写完了?时间因为写的内容不同写的时间从几秒到几十秒不等。<br>如何知道已经写完马上读?<br>用文件流 ms:tfilestream 监视可以吗?<br>我用 ms.Create('c:/a.txt',fmOpenWrite ) ;当a.txt变化时ms会变化吗?<br>现在是用sleep(60000);可是有时候一秒不到就写完了。白白多等了59秒。有没有API函数<br>能够马上得知a.txt的变化?问题解决再加300分
 
{在写文件进程中,如果完成操作,那么触发读文件进程的读文件的事件;<br>就像TEdit 的内容变化后会触发其OnChange 属性中设置的事件一样!}<br><br>unit ClassThreads;<br><br>interface<br><br>uses<br> &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms;<br><br>type<br> &nbsp;TReadThread = class (TThread)//读进程,里面有个读文件的事件<br> &nbsp;public<br> &nbsp; &nbsp;procedure Read(Sender : TObject);<br> &nbsp;end;<br><br> &nbsp;TWriteThread = class (TThread)//写进程,有写事件<br> &nbsp;private<br> &nbsp; &nbsp;FReadEvent: TNotifyEvent;<br> &nbsp;public<br> &nbsp; &nbsp;constructor Create(CreateSuspended: Boolean; AReadEvent : TNotifyEvent); reintroduce; overload;<br> &nbsp; &nbsp;property ReadEvent : TNotifyEvent read FReadEvent write FReadEvent;//读文件的事件属性,初始化的时候,或者其它时候可以给该属性赋值<br> &nbsp; &nbsp;procedure Write(Sender : TObject);<br> &nbsp;end;<br><br>procedure Run;<br><br>implementation<br><br>procedure Run;<br>// 使用范例<br>var<br> &nbsp;r : TReadThread;<br> &nbsp;w : TWriteThread;<br>begin<br> &nbsp;r := TReadThread.Create(True);<br> &nbsp;w := TWriteThread.Create(True, r.Read);<br> &nbsp;//...........<br>end;<br><br>{ TReadThread }<br><br>procedure TReadThread.Read(Sender: TObject);<br>begin<br> &nbsp;//<br>end;<br><br>{ TWriteThread }<br><br>constructor TWriteThread.Create(CreateSuspended: Boolean; AReadEvent : TNotifyEvent);<br>begin<br> &nbsp;inherited Create(CreateSuspended);<br> &nbsp;if Assigned(AReadEvent) then<br> &nbsp; &nbsp;ReadEvent := AReadEvent;<br>end;<br><br>procedure TWriteThread.Write(Sender: TObject);<br>begin<br> &nbsp;//处理写文件..............<br><br> &nbsp;//写文件完毕后,触发读事件<br> &nbsp;if Assigned(ReadEvent) then<br> &nbsp; &nbsp;ReadEvent(nil);<br>end;<br><br>end.
 
To royal1442<br> &nbsp;[:D]难就难在写不在本进程中。是线程通过消息通知另外一个进程(另外的程序写。并且不是我的程序不能发消息通知我。只知道他收到消息后会马上写a.txt文件。也不知道他什么时间写完)。同一进程中用你的代码很容易实现。谢谢了。不同进程是不是监视a.txt文件?好像很有难度啊。<br><br> &nbsp;[red]有没有朋友知道?[/red]
 
那就不好办了,除非它可以通过任意一种方式来通知你!
 
可以使用互斥。典型的进程同步问题
 
进程间的同步只能用互斥量<br>CreateMutex<br>OpenMutex<br>WaitForSingleObject<br>CloseHandle<br>ReleaseMutex<br>就这几个函数
 
比较两次读的同不同,不知中不中?或是文件属性中的各种时间(最后一次修改之类的)
 
多人接受答案了。
 
后退
顶部