⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 列表7.4.txt

📁 klinux书籍的配套光盘。可以学习学习。
💻 TXT
字号:
【列表7.4】程序 lockwriter 代码。
unit LockWriterMain;
interface
uses
   SysUtils, Types, Classes, Variants, QGraphics, QControls, QForms, QDialogs,
   QStdCtrls, Libc, QExtCtrls, QTypes, QComCtrls;

type
   TLockWriterMainForm = class(TForm)
      ExitBtn: TButton;
      UpdateBtn: TButton;
      ProcLabel: TLabel;
      RecNumRBGroup: TRadioGroup;
      WaitForWriteCB: TCheckBox;
      GroupBoxl: TGroupBox;
      UpdatePanel: TPanel;
      Trigger: TTimer;
      StatusBar: TStatusBar;
      Procedure UpdateRecord;
      procedure ExitBtnClick(Sender: TObject);
      procedure FormCreate(Sender: TObject);
      procedure UpdateBtnClick(Sender: TObject);
      procedure TriggerTimer(Sender: TObject);
  private
      { Private declarations }
  public
      { Public declarations }
   end;

const
   WriteDelay = 500; { milliseconds }
   DataFileName ='/tmp/LockRegion.data';
   NumRecs = 5;
   RecLen = 20;

var
    LockWriterMainForm: TLockWriterMainForm;
    PID : pid_t;
    PIDStr : String;
    DF : Integer;
    ErrResult : Integer;

 implementation

 {SR *.xfm}

 procedure TLockWriterMainForm. UpdateRecord;
 var
    RecNum : Integer;
    RandNum : Integer;
    LockRec : TFlock;
    Buf : array[0..RecLen] of char;
    DataStr : String;
 begin
    StatusBar. SimpleText := '';
    RecNum := RecNumRBGroup. ItemIndex + 1;
{go for an exclusive lock}
LockRec.l_type:=F_WRLCK;
LockRec.l_whence := SEEK_SET;
LockRec.l_len := RecLen;
LockRec.l_pid := -1;
LockRec.l_start := RecLen * (RecNum - 1);
If WaitForWriteCB.Checked
then begin
           StatusBar.SimpleText := 'Waiting to write...';
           ErrResult := fcntl(DF, F_SETLKW, LockRec);
      end
 else ErrResult := fcntl(DF, F_SETLK, LockRec);
if ErrResult <> -1
     then begin { We've got an exclusive lock }
               StatusBar. SimpleText := ' ';
               UpdatePanel.Color := clLime;
               Application.ProcessMessages;
               RandNum := Integer(Random(32768));
               DataStr := PIDStr + ' : ' + IntToStr(RecNum)
                 + ' : ' + IntToStr(RandNum);
                if Length(DataStr) > RecLen
                 then DataStr := copy(DataStr, 1, RecLen)
                 else while Length(DataStr) < RecLen do
                              DataStr := DataStr + ' ';
                StrPCopy(Buf, DataStr);
                lseek(DF, RecLen * (RecNum - 1), SEEK_SET);
                __write(DF, Buf, RecLen);
                Sleep(WriteDelay);
                { Release the lock for this record }
                LockRec.l_type := F_UNLCK;
                LockRec.l_whence := SEEK_SET;
                LockRec.l_len := RecLen;
                LockRec.l_pid := -1;
                LockRec.l_start := RecLen * (RecNum - 1);
                fcntl(DF, F_SETLK, LockRec);
                StatusBar.SimpleText := 'Updated successfully';
               end
 else begin
            StatusBar.SimpleText := 'Not able to obtain lock';
            UpdatePanel.Color := clRed;
            Application. ProcessMessages;
            Sleep(WriteDelay);
      end;

  UpdatePanel.Color := clGreen;
end;

procedure TLockWriterMainForm. ExitBtnClick(Sender: TObject);
begin
  Close;
 end;
procedure TLockWriterMainForm. FormCreate(Sender: TObject);
var
 F : TextFile;
 i : Integer;
 s : String;
begin
  Randomize;
  PID := getpid;
  PIDStr := IntToStr(PID);
  ProcLabel.Caption := 'Process ID: ' + PIDStr;
  if not FileExists(DataFileName)
    then begin { Create the data file }
              AssignFile(F, DataFileName);
              Rewrite(F);
              for i := 1 to NumRecs do
                begin
                  s := PIDStr + ' : ' + IntToStr(i) + ' : 0';
                  while Length(s) < RecLen do s := s + '  ';
                  write(F, s);
                end; { for }
               CloseFile(F);
             end;
   DF := open(DataFileName, O_RDWR);
   if DF = -1
     then begin
               UpdateBtn. Enabled := False;
               ShowMessage('Error opening data file!');
          end;
  end;

  procedure TLockWriterMainForm,UpdateBtnClick(Sender: TObject);
  begin
   Trigger. Enabled :=True;
  end;

  procedure TLockWriterMainForm. TriggerTimer(Sender: TObject);
  begin
    Trigger. Enabled := False;
    UpdateBtn.Enabled := False;
    UpdateRecord;
    UpdateBtn. Enabled := True;
   end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -