实现对一个文本文件读操作和写操作,如 a.txt 文件,文件内容为:Abcdefafdafdfdsaf
erexdfaffdaffdfsaf
ffsvsfafasfweffagfa
ewrewrewrwerwerf
fsafsgerererwerwgd
bgsdgfdgfdgdfgdffe
ffsafdsfsdafsdfdwer
一个线程对文件内容,进行读,同时将读出的字符进行大写转换,并替换。另一个线程,实现对文件的写操作,不停地随机往文件写入小写字母(如果 dfafsdfsa)。
要求 通过 多线程 和 内核对象 实现。 

解决方案 »

  1.   

    本帖最后由 bdmh 于 2011-01-08 17:30:50 编辑
      

  2.   

    DELPHI5开发人员指南中有一个例程,利用内存映射文件将大写和小写的互换,希望对你有帮助
    unit MainFrm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls;const
      FName = 'test.txt';type  TMainForm = class(TForm)
        btnUpperCase: TButton;
        memTextContents: TMemo;
        lblContents: TLabel;
        btnLowerCase: TButton;
        procedure btnUpperCaseClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure btnLowerCaseClick(Sender: TObject);
      public
        UCase: Boolean;
        procedure ChangeFileCase;
      end;var
      MainForm: TMainForm;implementation{$R *.DFM}procedure TMainForm.btnUpperCaseClick(Sender: TObject);
    begin
      UCase := True;
      ChangeFileCase;
    end;procedure TMainForm.btnLowerCaseClick(Sender: TObject);
    begin
      UCase := False;
      ChangeFileCase;
    end;procedure TMainForm.FormCreate(Sender: TObject);
    begin
      memTextContents.Lines.LoadFromFile(FName);
      // Change to upper case by default.
      UCase := True;
    end;procedure TMainForm.ChangeFileCase;
    var
      FFileHandle: THandle; // Handle to the open file.
      FMapHandle: THandle;  // Handle to a file-mapping object
      FFileSize: Integer;   // Variable to hold the file size.
      FData: PByte;         // Pointer to the file's data when mapped.
      PData: PChar;         // Pointer used to reference the file data.
    begin  { First obtain a file handle to the file to be mapped. This code
        assumes the existence of the file. Otherwise, you can use the
        FileCreate() function to create a new file. }  if not FileExists(FName) then
        raise Exception.Create('File does not exist.')
      else
        FFileHandle := FileOpen(FName, fmOpenReadWrite);  // If CreateFile() was not successful, raise an exception
      if FFileHandle = INVALID_HANDLE_VALUE then
        raise Exception.Create('Failed to open or create file');  try
        { Now obtain the file size which we will pass to the other file-
          mapping functions. We'll make this size one byte larger as we
          need to append a null-terminating character to the end of the
          mapped-file's data.}
        FFileSize := GetFileSize(FFileHandle, Nil);   { Obtain a file-mapping object handle. If this function is not
          successful, then raise an exception. }
        FMapHandle := CreateFileMapping(FFileHandle, nil,
           PAGE_READWRITE, 0, FFileSize, nil);    if FMapHandle = 0 then
          raise Exception.Create('Failed to create file mapping');
      finally
        // Release the file handle
        CloseHandle(FFileHandle);
      end;  try
        { Map the file-mapping object to a view. This will return a pointer
          to the file data. If this function is not successful, then raise
          an exception. }
        FData := MapViewOfFile(FMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, FFileSize);    if FData = Nil then
          raise Exception.Create('Failed to map view of file');  finally
        // Release the file-mapping object handle
        CloseHandle(FMapHandle);
      end;  try
        { !!! Here is where you would place the functions to work with
        the mapped file's data. For example, the following line forces
        all characters in the file to uppercase }
        PData := PChar(FData);
        // Position the pointer to the end of the file's data
        inc(PData, FFileSize);    // Append a null-terminating character to the end of the file's data
        PData^ := #0;    // Now set all characters in the file to uppercase
        if UCase then
          StrUpper(PChar(FData))
        else
          StrLower(PChar(FData));  finally
        // Release the file mapping.
        UnmapViewOfFile(FData);
      end;
      memTextContents.Lines.Clear;
      memTextContents.Lines.LoadFromFile(FName);
    end;end.