Delphi | Чтение карты памяти

Категория: Уроки по Delphi

Если мы можем, получит список запущенных процессов, то представляется интересной возможность прочитать содержимое адресного пространства процесса с целью определить, какие регионы зарезервированы в адресном пространстве процесса, каков объем зарезервированных регионов и свободного адресного пространства, как установлен режим доступа к тем или иным регионам и т.д..  Одним словом, надо читать карту адресного пространства процесса.
При создании процесса можно управлять доступом к его адресному пространству, т.е. разрешать или не разрешать чтение адресного пространства процесса.
Естественно, что прочитать вы можете только участок адресного пространства, отведенный в собственность прикладному процессу (т.е. 2 ГБ пользовательского адресного пространства процесса)
При помощи функции GetSystemInfo() получаем границы данного региона, т.е. минимальный и максимальный адреса, доступные приложению. Теперь наша задача - прочитать содержимое адресного пространства, ограниченного данными адресами.
Читаем при помощи функции VirtualQuery()
Чтение карты адресного пространства производим, организуя цикл от минимального доступного адреса до максимального доступного.
Передаем в VirtualQuery() минимальный из доступных адресов при первой итерации цикла. Функция возвратит нам объем региона, зарезервированного по данному адресу, его объем, установленный режим защиты и т.д.
Адрес следующего региона получаем так:
<Текущий адрес региона>+<Объем текущего региона>
Далее продолжаем итерации пока не доберемся до максимального из доступных адресов.
 
Вроде вот так 
 

Delphi | Организация межзадачного обмена

Категория: Уроки по Delphi

Задание. Организовать работу программы-сервера и нескольких программ клиентов следующим образом:
Сервер предоставляет клиентам кокой-либо из своих ресурсов (например, собственное окно)
Клиенты подключаются к серверу и начинают запись в окно,  причем первый клиент пишет только «1», второй – только «2», и т.д. Клиентов может быть произвольное количество, но не менее пяти.
 Если клиент подключается к серверу в монопольном режиме, он получает исключительные права на использование ресурса сервера. Все остальные клиенты, пытающиеся подключиться в данный момент, не должны получить доступ к ресурсу сервера и должны оказаться в очереди на обслуживание. 
В разделяемом режиме каждому из подключенных клиентов предоставляется квант времени на исполнение (например 1с). Если клиент записывает символы в окно сервера с частотой 1 символ в секунду, то в случае, когда к серверу подключено пять клиентов, окно сервера должно содержать примерно следующую информацию:
Сервер: подключено 5 клиентов
12:12:01           1 2 3 4 5
12:12:02           1 2 3 4 5
Клиент 5 отключился от сервера
12:12:03           1 2 3 4
12:12:03           1 2 3 4
Обмен данными между клиентами и сервером организовать либо при помощи именованных каналов (named pipes).

Вот, что то не прет в написании этого кода просто ужас какой то... 
Надеюсь завтра соберусь с мыслями и все получиться!
Ну получилось, что то вроде этого
 

Delphi | Файлы, проецируемые в память

Категория: Уроки по Delphi

Технология файлов, проецируемых в память, является изящным средством для разделения ресурсов файловой системы между процессами.
При проецировании файла на адресное пространство процесса процесс может обращаться к содержимому файла так, как если бы файл был загружен в оперативную память.
Если несколько процессов выполняют проецирование одного и того же файла, то содержимое файла будет доступно для всех процессов, то есть позволит избежать загрузки множества экземпляров файла в оперативную память.
Для проецируемых файлов применяется 64-битная адресация, что позволяет использовать данную технологию для обработки сверхбольших (до 18 экзабайт) файлов, преодолевая, тем самым, ограничение на размер файла в 2 гигабайта.

Порядок работы:

  1. Проецируемый файл открывается при помощи функции CreateFile() илиOpenFile().
  2. Создается новый объект ядра ОС типа «файл, проецируемый в память» системным вызовом CreateFileMapping(). В качестве первого параметра в него передается описатель файла открытого функцией CreateFile().
  3. Вызов функции MapViewOfFile() возвращает указатель на участок спроецированного файла. После вызова MapViewOfFile() можно осуществлять чтение данных из области адресного, обозначенного возвращенным указателем.
  4. После завершения чтения вызывается функция UnmapViewOfFile(), в качестве параметра в нее передается указатель, возвращенный на этапе (3).
  5. Закрываем описатель файла функцией CloseHandle().
Задание.
Решить задачу из лабораторной работы №5 с использованием файлов, проецируемых в память, вместо каналов. Требуется запустить «программу-писатель» и несколько экземпляров «программы-читателя». Программа-писатель постоянно обновляет содержимое некоторого файла. Программы читатели проецируют данный файл на собственное адресное пространство. При обновлении файла происходит автоматическое обновление содержимого файла в окнах программ-читателей.

Решение реализовал вот так:
 

Delphi | Как создать именованную, совместно используемую память

Категория: Уроки по Delphi

Ни для кого не секрет что современные компьютеры поддерживают многопроцессорные приложения. В этом уроке мы научимся использовать по максимуму возможности современных компьютеров!

Первый процесс создает файл Temp.txt, после чего проецирует его в память. Вот его код:

 

Delphi | Как вывести время простоя компьютера

Категория: Уроки по Delphi

Чтобы вывести время простоя компьютера нужно написать следующую функцию:

function CheckIddleTime: DWord;
var
   LastInput: TLastInputInfo;
begin
   LastInput.cbSize := SizeOf(TLastInputInfo);
   GetLastInputInfo(LastInput);
   Result := GetTickCount - LastInput.dwTime;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption:= 'Время простоя: ' + vartostr(CheckIddleTime/1000)+' секунд(ы)';
end;