Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2012, 14:20   #1
The Real Kos
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 18
Лампочка Создание/изменение/удаление файлов в потоке. Мониторинг файлов в потоке.

Вот задание:
имеется заданный каталог, потоки читатели считывают и отображают информацию о файлах и подкаталогах (размер, атрибуты файла, имена и пр.), потоки-писатели выполняют изменение атрибутов и содержимого файлов, создают или удаляют файлы и каталоги

Я очень мало знаю в программировании, так что не ругайтесь Вот что я пока напридумывал

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TNewThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  NewThread: TNewThread;

implementation
{$R *.dfm}

procedure TNewThread.Execute;
begin
  while true do {íè÷åãî íå äåëàåì};
end;

procedure TForm1.btn1Click(Sender: TObject);

Var f:System.Text; //êëàññ òåêñòîâîãî ôàéëà
t:System.Text;
r:System.Text;
int : Integer;
i : Integer;
x,y,z : string;
NewThread: TNewThread;

const
x1='ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'; x2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; x3='1234567890';
y1='ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'; y2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; y3='1234567890';
z1='ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß'; z2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; z3='1234567890';
attr: array [1..9] of integer=(0,1,2,4,8,16,32,64,71);
//FILE_ATTRIBUTE_NORMAL 0
//faReadOnly	  1
//faHidden	    2
//faSysFile	    4
//faVolumeID    8
//faDirectory	 16
//faArchive	   32
//faSymLink	   64
//faAnyFile	   71



begin

  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
  NewThread.Resume;

  ForceDirectories('E:\TEST\TEST1');
  ForceDirectories('E:\TEST\TEST2');
  ForceDirectories('E:\TEST\TEST3');

  SetFileAttributes('E:\TEST\TEST1\1.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST1\1.txt');
  x:= x1[Random(33)+1] + x2[Random(26)+1] + x3[Random(10)+1];
  AssignFile(f,'E:\TEST\TEST1\1.txt'); //ðåãèñòðàöèÿ ôàéëà
  Rewrite(f); //ñîçäàíèå ôàéëà, åñëè îí òàì åñòü, òî ïåðåçàïèñûâàåòüñÿ (ñòàðûé óäàëÿåòñÿ, íîâûé ïóñòîé ïîÿâëÿåòüñÿ)
  //Reset(f); //ïðîñòî îòêðûâàåì ôàéë äëÿ ðåäàêòèðîâàíèÿ
  Write(f, x); //çàïèñûâàåì ñòðîêó â ôàéë áåç ïåðåâîäà êóðñîðà íà íîâóþ ñòðîêó
  CloseFile(f); //çàêðûâàåì ôàéë
  SetFileAttributes('E:\TEST\TEST1\1.txt', attr[Random(9)]);

  SetFileAttributes('E:\TEST\TEST2\2.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST2\2.txt');
  y:= y1[Random(33)+1] + y2[Random(26)+1] + y3[Random(10)+1];
  AssignFile(t,'E:\TEST\TEST2\2.txt');
  Rewrite(t);
  Write(t, y);
  CloseFile(t);
  SetFileAttributes('E:\TEST\TEST2\2.txt', attr[Random(9)]);

  SetFileAttributes('E:\TEST\TEST3\3.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST3\3.txt');
  z:= z1[Random(33)+1] + z2[Random(26)+1] + z3[Random(10)+1];
  AssignFile(r,'E:\TEST\TEST3\3.txt');
  Rewrite(r);
  Write(r, z);
  CloseFile(r);
  SetFileAttributes('E:\TEST\TEST3\3.txt', attr[Random(9)]);
end;

end.
Вопрос в следующем: При запуске в диспетчере создается очень много потоков, можно ли их синхронизировать? Можно ли сделать, чтобы создавалось случайное количество файлов и в них записывалось слово случайной длины?

Последний раз редактировалось The Real Kos; 20.10.2012 в 14:24.
The Real Kos вне форума Ответить с цитированием
Старый 20.10.2012, 23:40   #2
The Real Kos
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 18
По умолчанию

Вот набросал еще чуть чуть Но вопросы те же остались
Код:
unit Unit1; 
interface 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls; 
type
  TNewThread = class(TThread)
  procedure Execute; override;
  private
  procedure CreateDirectories; end;
  TMyThread = class(TThread)
  procedure Execute; override;
  private
    FPath: String;
    procedure UpdateLog;
    procedure ThreadStart;
  public
    constructor Create(aPath: String); end;
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    lst1: TListBox;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end; 
var
  Form1: TForm1;
implementation
{$R *.dfm} 
constructor TMyThread.Create(aPath: string);
begin
  inherited Create(True);     //Созданный поток создается в приостановленном состоянии
  FreeOnTerminate := True;    
  FPath := aPath;               //Проверяемый каталог
  Self.Priority := tpHighest; 
  Resume;
end; 
procedure TNewThread.Execute;
begin
  Sleep(1000);
  Synchronize(CreateDirectories);
end; 
procedure TNewThread.CreateDirectories;
begin
  ForceDirectories('E:\TEST\TEST1');
  ForceDirectories('E:\TEST\TEST2');
  ForceDirectories('E:\TEST\TEST3');
end; 
procedure TMyThread.ThreadStart;
begin
  Form1.lst1.Items.Add(TimeToStr(time)+': монитор запущен');
end; 
procedure TMyThread.UpdateLog;
begin
  Form1.lst1.Items.Add(TimeToStr(time)+': изменение!');
  if Form1.lst1.Items.Count > 200 then
  Form1.lst1.Items.Delete(0);
  Form1.lst1.ItemIndex := Form1.lst1.Items.Count-1;
end; 
procedure TMyThread.Execute;
var
  HandleChange: THandle;  //Handle создаваемого объекта для ожидания события
begin
//-- Создаем объект для ожидания события
  HandleChange :=
    FindFirstChangeNotification(
      PChar(FPath),   //Проверяемый каталог
      True,                                 
      FILE_NOTIFY_CHANGE_FILE_NAME +
      FILE_NOTIFY_CHANGE_ATTRIBUTES); 
//-- При ошибке Win32Check выводит сообщение и прерывает Execute.
    Win32Check(HandleChange <> INVALID_HANDLE_VALUE);
     Synchronize(ThreadStart);            //Сообщение о старте потока
  try
//-- Цикл, пока для потока не будет выдана команда Terminate
    while not Terminated do
    begin
      case WaitForSingleObject(HandleChange,1000) of
        WAIT_FAILED: Terminate;                //Ошибка, завершаем поток
        WAIT_OBJECT_0: Synchronize(UpdateLog); //Сообщаем об изменении
      end;
      FindNextChangeNotification(HandleChange);
    end;
  finally
    FindCloseChangeNotification(HandleChange);
  end;
end; 
procedure TForm1.btn1Click(Sender: TObject); 
Var f:System.Text; 
t:System.Text;
r:System.Text;
x,y,z : string;
NewThread: TNewThread; 
const
x1='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; x2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; x3='1234567890';
y1='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; y2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; y3='1234567890';
z1='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; z2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; z3='1234567890';
attr: array [1..9] of integer=(0,1,2,4,8,16,32,64,71);
//FILE_ATTRIBUTE_NORMAL 0
//faReadOnly      1
//faHidden      2
//faSysFile     4
//faVolumeID    8
//faDirectory    16
//faArchive    32
//faSymLink    64
//faAnyFile    71 
begin
  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower; 
  SetFileAttributes('E:\TEST\TEST1\1.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST1\1.txt');
  x:= x1[Random(33)+1] + x2[Random(26)+1] + x3[Random(10)+1];
  AssignFile(f,'E:\TEST\TEST1\1.txt'); //регистрация файла
  Rewrite(f); //создание файла, если он там есть, то перезаписываеться (старый удаляется, новый пустой появляеться)
  //Reset(f); //просто открываем файл для редактирования
  Write(f, x); //записываем строку в файл без перевода курсора на новую строку
  CloseFile(f); //закрываем файл
  SetFileAttributes('E:\TEST\TEST1\1.txt', attr[Random(9)]); 
  SetFileAttributes('E:\TEST\TEST2\2.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST2\2.txt');
  y:= y1[Random(33)+1] + y2[Random(26)+1] + y3[Random(10)+1];
  AssignFile(t,'E:\TEST\TEST2\2.txt');
  Rewrite(t);
  Write(t, y);
  CloseFile(t);
  SetFileAttributes('E:\TEST\TEST2\2.txt', attr[Random(9)]); 
  SetFileAttributes('E:\TEST\TEST3\3.txt', FILE_ATTRIBUTE_NORMAL);
  DeleteFile('E:\TEST\TEST3\3.txt');
  z:= z1[Random(33)+1] + z2[Random(26)+1] + z3[Random(10)+1];
  AssignFile(r,'E:\TEST\TEST3\3.txt');
  Rewrite(r);
  Write(r, z);
  CloseFile(r);
  SetFileAttributes('E:\TEST\TEST3\3.txt', attr[Random(9)]); 
  NewThread.Resume;
end; 
procedure TForm1.btn2Click(Sender: TObject);
begin
    Form1.lst1.Tag := Integer(TMyThread.Create('E:\TEST'));
    btn2.Visible := False;
end; 
end.
The Real Kos вне форума Ответить с цитированием
Старый 21.10.2012, 17:26   #3
The Real Kos
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 18
По умолчанию

Вверх! )
The Real Kos вне форума Ответить с цитированием
Старый 21.10.2012, 19:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну а ты запускал код? Работает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2012, 22:46   #5
The Real Kos
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну а ты запускал код? Работает?
естественно запускал, и работает она
The Real Kos вне форума Ответить с цитированием
Старый 22.10.2012, 23:58   #6
The Real Kos
Пользователь
 
Регистрация: 16.05.2011
Сообщений: 18
По умолчанию

И снова подъем!
The Real Kos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ или создание объекта в другом потоке Maks1978 Общие вопросы C/C++ 0 04.10.2012 13:51
Создание формы в потоке Pamparam Общие вопросы Delphi 19 01.12.2011 06:12
Какой раз пытаюсь понять как же сделать в одном потоке удаление строки из файла... но безуспешно. dykatob Общие вопросы C/C++ 14 20.05.2011 23:54
Мониторинг файлов SERG1980 Общие вопросы Delphi 7 10.08.2010 13:32
Создание удаление каталогов, копирование файлов. Alar Общие вопросы Delphi 1 18.12.2007 18:30