Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
4 / 4 / 0
Регистрация: 18.02.2013
Сообщений: 32
1

Взаимодействие двух процессов

20.12.2014, 16:26. Показов 1211. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста сделать две нити.
первая нить "Писатель"
вторая нить "Читатель"

Писатель
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
unit FirstUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Con-trols, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Label3: TLabel;
    GenBtn: TButton;
    ClearBtn: TButton;
    procedure GenBtnClick(Sender: TObject);
    procedure ClearBtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
var
  MyMutex: Thandle;
 
procedure TForm1.GenBtnClick(Sender: TObject);
var
  m: cardinal;
  i, j, n: integer;
  ff: TextFile;
begin
  if Edit1.Text = '' then
    begin
      ShowMessage('Не задано количество чисел');
      Exit;
    end;
   n:= StrToInt(Edit1.Text);
 
  randomize;
  for i:= 1 to n do
    begin
// Ждем освобождения мьютекса, если он занят в этом или другом процессе
      if WaitForSingleObject(MyMutex, INFINITE) = WAIT_OBJECT_0 then
        begin    // Выполняется при свободном  мьютексе
          AssignFile(ff,'1.txt');
          Rewrite(ff);
          m:= random (4294967295);   // самое большое 32 разрядное число
          writeln(ff, m);            // пишем его в файл
          Memo1.Lines.Add(IntToStr(m));
//          Flush(ff);                // фиксируем изменения файла на диск
          CloseFile(ff);
 
// Освобождаем мьютекс
          ReleaseMutex(MyMutex);
// Ждем  0.5 секунды, чтобы 2ой процесс зазватил мьютекс
          Sleep(500);
          j:=0;
// Ждем пока не будет файла, т.е. пока вторая программа его удалит
          While FileExists('1.txt') do // Ждем еще до 5 секунд
            begin
              Sleep(500);
              inc(j);
              if j = 10 then
                begin
                  ShowMessage('Не запущена читающая программа' +
                      chr(13) + chr(10) + 'или ожидание слишком велико');
                  Exit;
                end;
            end;
// Конец цикла вывода чисел
        end;
    end;
// После генерации последнего числа захватываем его и сразу осво-бождаем
  if WaitForSingleObject(MyMutex, INFINITE) = WAIT_OBJECT_0 then
    ReleaseMutex(MyMutex);
end;
 
procedure TForm1.ClearBtnClick(Sender: TObject);
begin
  Memo1.Clear;
end;
 
initialization
  MyMutex:= 0;
  MyMutex:= CreateMutex(nil, False, 'Mutex001');
  if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageBox(0,'Вполне возможно читающая программа уже'  + chr(13) + chr(10) +
                              'читала информацию и не освободила мьютекс,' + chr(13) + chr(10) +
                              'перезапустите читающую программу', 'Ошибка',
                              MB_OK or MB_ICONSTOP);
      halt;
    end;
 
finalization
  CloseHandle(MyMutex);
 
end.
Читатель
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
unit SecondUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Con-trols, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    Edit1: TEdit;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
var
  MyMutex: THandle;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  m: cardinal;
  i, j, n: integer;
  ff: TextFile;
begin
// Создаем или открываем мьютекс
  n:= 10000; // Предполагаем чтение 10000 чисел
   randomize;
   for i:= 1 to n do
     begin
       MyMutex:= OpenMutex(SYNCHRONIZE, FALSE, 'Mutex001');
       if MyMutex = 0 then
         begin
           ShowMessage('Не запущен процесс, создающий мьютекс');
           Exit;
         end;
// Ждем освобождения мьютекса, если он занят
       if WaitForSingleObject(MyMutex, INFINITE) = WAIT_OBJECT_0 then
// Выполняется при свободном  мьютексе
         begin
           if FileExists('..\1\1.txt') then
             begin
               AssignFile(ff,'..\1\1.txt'); // Файл в каталоге в папке "1" рядом
               Reset(ff);
             end
           else
             begin
               ShowMessage('Нет файла с данными или не' + chr(13) + chr(10) +
                           'запущена создающая файл программа');
               Exit;
             end;
           readln(ff, m);   // читаем число
           Memo1.Lines.Add(IntToStr(m));// пишем его в Memo
           CloseFile(ff);
           DeleteFile('..\1\1.txt');   // Удаляем файл
// Освобождаем мьютекс
           ReleaseMutex(MyMutex);
 
// Ждем  0.5 секунды
           Sleep(500); j:=0;
// Ждем появления файла, т.е. пока первая программа его создаст
           while not FileExists('..\1\1.txt') do  // Ожидаем появления файла
             begin                                // до 3х секунд
               Sleep(500);
               inc(j);
               if j = 6 then
                 begin
                   ShowMessage('Не могу больше ничего прочитать' + chr(13) +
                                chr(10) + 'или передача завершена');
                   Edit1.Text:= IntToStr(i);
                   Exit;
                   ReleaseMutex(MyMutex);
                 end;
             end;
         end;
     end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Clear;
  Edit1.Clear;
end;
 
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  key:= #0;
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2014, 16:26
Ответы с готовыми решениями:

Взаимодействие двух модулей
Всем привет. Вопрос такой: есть два модуля, назову их основной и новый. И так создаю новый модуль,...

Организовать взаимодействие двух процессов через неименованный программный канал
Подскажите, где почитать про это и что надо сделать точно. А то тут лабу задали, а лекции пока не...

Взаимодействие процессов
Подскажите пожалуйста как мне наладить взаимодействие между двумя процессами через каналы. Вот...

Взаимодействие процессов
Нужно написать задачу, в которой дано 10 процессов (там P1, P2, …, Р10, например) Функционирование...

3
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
20.12.2014, 18:16 2
Цитата Сообщение от Dmitrry Посмотреть сообщение
сделать две нити
имеется в виду два потока (Thread), работающие в одном процессе? и в чем заключается "помогите"?
0
4 / 4 / 0
Регистрация: 18.02.2013
Сообщений: 32
23.12.2014, 16:37  [ТС] 3
Цитата Сообщение от cotseec Посмотреть сообщение
имеется в виду два потока (Thread), работающие в одном процессе? и в чем заключается "помогите"?
Нужно сделать две нити(Thread) работающие в одном процессе. сможешь помочь?
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
23.12.2014, 18:38 4
Цитата Сообщение от Dmitrry Посмотреть сообщение
сможешь помочь?
как бы
Цитата Сообщение от cotseec Посмотреть сообщение
в чем заключается "помогите"?
помогите<>сделайте мне
0
23.12.2014, 18:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2014, 18:38
Помогаю со студенческими работами здесь

Взаимодействие процессов
Всем привет. Запаситесь терпением, ибо описывать проблему я буду долго :) Итак, что требуется, в...

Взаимодействие процессов. Сигналы
Создать дерево процессов 1-&gt;(2,3) 2-&gt;(4,5) 5-&gt;6 6-&gt;(7,8) Процессы непрерывно...

Взаимодействие процессов в Windows
Есть 2 процесса, которые взаимодействуют с помощью очереди сообщений,один процесс размещает...

Взаимодействие процессов / WinAPI
Доброе время суток, форумчане! Прощу вашей помощи! :help: Для знающих и опытных программистов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru