Форум программистов, компьютерный форум CyberForum.ru

Взаимодействие между процессами двух приложений - C++

Восстановить пароль Регистрация
 
San-ch
1 / 1 / 1
Регистрация: 03.03.2011
Сообщений: 43
30.12.2012, 06:10     Взаимодействие между процессами двух приложений #1
В задании к лабораторной сказано, что нужно открыть файл в одном приложении, а считывать данные с помощью другого приложения. Не могу представить, как это вообще должно происходить, можете объяснить на пальцах?

Текст задания:
Исследовать возможность создания двух приложений. Процессы, образованые после активации приложений, взаимодействуют между собой. Первое приложение содержит открытый файл Ф11 для считывания данных. Второе приложение считывает данные из файла первого приложения и по очереди передаёт их в файлы Ф21, Ф22, Ф23. Каждый из них открыт в своём отдельном потоке. ... Синхронизация с помощью критической секции, мьютекса, семафора.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
30.12.2012, 11:06     Взаимодействие между процессами двух приложений #2
Цитата Сообщение от San-ch Посмотреть сообщение
Не могу представить, как это вообще должно происходить, можете объяснить на пальцах?
- ну вот про распараллеливание с помощью критической секции
Распараллеливание
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 11:21     Взаимодействие между процессами двух приложений #3
для этого надо знать основы Win API.

я думаю так:
1.Создаешь процесс который открывает файл, записывает в него и т.д. Видимо эта информация/файл в разделяемой памяти.
2.Создаешь второй процесс и в нем потоки обработчики.
3.Процесс обращается к разделяемой памяти.
4.Информация в разделяемой памяти синхронизирована с помощью....
5.Создаешь потоки во втором процессе которые записывают информацию в файлы.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.12.2012, 11:25     Взаимодействие между процессами двух приложений #4
Постановка задачи корявая. Как это- открыть файл на считывание одним приложением (может быть создать? тогда другое дело), а считывать другим? Впрочем, почему бы и не попробовать, чисто из учебных целей.

Теперь по синхронизации. Тут особо ничё синхронизировать и не надо- считывай себе и всё. Если бы стояла задача: один поток читает до позиции X, второй с позиции X до позиции Y, третий с позиции Y до позиции Z- то есть если бы работа одного потока зависела от результата работы другого- надо было бы синхронизровать. А тут каждый поток может считывать пока всё не считает и ничего о другом потоке не знать. Куда тут синхронизацию запихать? Не нужна она.
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 11:31     Взаимодействие между процессами двух приложений #5
Цитата Сообщение от kravam Посмотреть сообщение
Постановка задачи корявая. Как это- открыть файл на считывание одним приложением (может быть создать? тогда другое дело), а считывать другим? Впрочем, почему бы и не попробовать, чисто из учебных целей.

ну видимо есть файл с информацией, которая записана заранее, вот его надо открыть.


Теперь по синхронизации. Тут особо ничё синхронизировать и не надо- считывай себе и всё. Если бы стояла задача: один поток читает до позиции X, второй с позиции X до позиции Y, третий с позиции Y до позиции Z- то есть если бы работа одного потока зависела от результата работы другого- надо было бы синхронизровать. А тут каждый поток может считывать пока всё не считает и ничего о другом потоке не знать. Куда тут синхронизацию запихать? Не нужна она.
так информация передается по очереди же. я не помню как работать с файлом, просто пример с массивом приведу, вот есть массив из 10 символов, вот первый поток передает первый символ, второй второй и т.д., вроде нормально, но поток же меняет счетчик, и если оба изменят, все- неверно будет.
может надо будет передавать информацию по строкам? может такая же ситуация быть?
ну или вариант передать файл полностью, то есть пока первый поток не отработает, не передаст, второму потоку нельзя обратится к файлу, вдруг там что-то изменится и т.д.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.12.2012, 12:13     Взаимодействие между процессами двух приложений #6
pavlovnik, вот глобальный массив:

C++
1
2
char array [1000];
//инициализация array
функция потока:

C++
1
2
3
for (char i; i< 1000; i++) {
 //считывание массива array в файл ФN
}
ты же не хочешь сказать, что если один поток считает 500 байтов, а потом начнёт работать второй поток, то он начнёт считывание с 500-го байта? Нет, конечно. Считают себе спокойно весь массив каждый в свой файл ничё друг о друге не зная и всё на этом.

Добавлено через 31 минуту
C++
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
#include <stdio.h> 
#include <pthread.h> 
#include <windows.h>
using namespace std;
 
 
 
 
//Функция потока, простосчитывает из одного файла в другой символы посимвольно.
void *task1(void *X) { 
 
 FILE* fp_0,* fp_1;
 fp_0= fopen ("src.txt", "r");
 fp_1= fopen ((char*)X, "w");
 if (fp_0&& fp_1) {
      int c;
      while ((c= getc (fp_0))!=EOF) {
       Sleep (1000);
       printf ("считал в %s\n", X);
       putc (c, fp_1);
      }
      fclose(fp_0); 
      fclose(fp_1); 
 }
 else {
  printf ("Всё плохо\n"); 
 }
 return NULL; 
} 
 
//////////////////////////////////////////////////////////////////////////////
 
int main(int argc, char *argv[]) { 
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 void* status; 
 
 pthread_t ThreadA; // Объявляем потоки. 
 pthread_t ThreadB; // Объявляем потоки. 
 pthread_t ThreadC; // Объявляем потоки. 
 pthread_create(&ThreadA,NULL,task1, (void*)"re0.txt"); // Создаем  потоки. 
 pthread_create(&ThreadB,NULL,task1, (void*)"re1.txt"); // Создаем  потоки. 
 pthread_create(&ThreadC,NULL,task1, (void*)"re2.txt"); // Создаем  потоки. 
 
 // Дополнительная обработка. 
 pthread_join(ThreadA, &status); // Ожидание завершения 
 pthread_join(ThreadB, &status); // Ожидание завершения 
 pthread_join(ThreadC, &status); // Ожидание завершения 
 getchar ();
 return (0) ; 
}
ну в общем все потоки считывают файл полностью не заботясь друг о друге как я и предполагал; чё тут за синхронизация может быть, остаётся загадкой.
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 13:29     Взаимодействие между процессами двух приложений #7
значит я что-то не понимаю. Потоков несколько, они поочередно передают в файлы! А как соблюдать очередь без синхронизации? пока один поток всю информацию из файла не передаст в другой файл, следующий поток не может начать работу( по заданию а не по факту). А то создашь потоков и они будут параллельно выполняться.
при работе с общими файлами всегда нужна синхронизация.
А если у него программа делает так, что информацию передается,а пользователь взял и изменил её. Тогда уже следующий поток будет измененную информацию передавать, а ставишь синхронизацию, что не изменять, пока до конца не передаст или в это роде, чтобы все логично было. может так? для нас все равно условия загадка)

Добавлено через 56 секунд
да и в задании синхронизация есть, значит либо он там нужна, либо ее все равно надо запихнуть, по требованию разработчика)
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.12.2012, 14:06     Взаимодействие между процессами двух приложений #8
заказчика, ты хотел сказать. Да там заказчик наверное как мы с тобой. Но в одном ты прав- условие загадка

Цитата Сообщение от pavlovnik Посмотреть сообщение
пока один поток всю информацию из файла не передаст в другой файл, следующий поток не может начать работу( по заданию а не по факту)
И опять- ну какая тут синхронизация? Последовательно потоки включаешь и всё на этом. Можно, конечно, придумать чтобы поток по окончании считывания сигнализировал об этом- семафор там мьютекс или ещё что. Наверное так и надо сделать.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,645
Записей в блоге: 17
30.12.2012, 15:39     Взаимодействие между процессами двух приложений #9
Цитата Сообщение от San-ch Посмотреть сообщение
Синхронизация с помощью критической секции, мьютекса, семафора.
Процессы как я помню нельзя синхронизировать с помощью критических секций - только потоки.

Добавлено через 2 минуты
Цитата Сообщение от San-ch Посмотреть сообщение
Первое приложение содержит открытый файл Ф11 для считывания данных. Второе приложение считывает данные из файла первого приложения
Оба для считывания, нужна ли тут синхронизация ?
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 21:03     Взаимодействие между процессами двух приложений #10
Цитата Сообщение от kravam Посмотреть сообщение
И опять- ну какая тут синхронизация? Последовательно потоки включаешь и всё на этом. Можно, конечно, придумать чтобы поток по окончании считывания сигнализировал об этом- семафор там мьютекс или ещё что. Наверное так и надо сделать.

Стоп, как ты их последовательно то пустишь? По-моему ты пускаешь несколько потоков подряд, и они параллельно выполняются, если не напишешь функцию, WaitForMultipleObjects() ( надо конкретно смотреть сколько потоков ловить и т.д. Ведь запуская поток в майне дальше продолжается код и не останавливается, запускается следующий и следующий, а эта функция тормознет исполнение кода до наступления события. Поэтому мне и кажется что тут синхронизация должна быть, чтобы только ОДИН поток копировал файл, а остальные ждали)))

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Процессы как я помню нельзя синхронизировать с помощью критических секций - только потоки.


дальше смотри задание, создаются потоки, которые наверное и синхронизируются)

Добавлено через 2 минуты

Оба для считывания, нужна ли тут синхронизация ?
ун можно организовать синхронизацию доступа к файлу.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
30.12.2012, 21:22     Взаимодействие между процессами двух приложений #11
Цитата Сообщение от pavlovnik Посмотреть сообщение
Стоп, как ты их последовательно то пустишь?
Уже пустил. Всё просто на самом деле:

"Функция pthread_join () используется для присоединения или воссоединения
потоков выполнения в одном процессе. Эта функция обеспечивает приостановку выполнения вызывающего потока до тех пор, пока не завершится заданный поток."

C++
1
2
3
4
5
6
 pthread_create(&ThreadA,NULL,task1, (void*)"re0.txt"); // Создаем  поток. 
 pthread_join(ThreadA, &status); // Ожидание завершения 
 pthread_create(&ThreadB,NULL,task1, (void*)"re1.txt"); // Создаем  поток. 
 pthread_join(ThreadB, &status); // Ожидание завершения 
 pthread_create(&ThreadC,NULL,task1, (void*)"re2.txt"); // Создаем  поток. 
 pthread_join(ThreadC, &status); // Ожидание завершения
Цитата Сообщение от pavlovnik Посмотреть сообщение
Поэтому мне и кажется что тут синхронизация должна быть, чтобы только ОДИН поток копировал файл, а остальные ждали)))
вот она и есть -та самая синхронизация с помощью pthread_join; сперва один поток потом второй потом третий. Только по заданию требуются семафоры мьютексы и критические секции.

Прошу любить и жаловать: библиотека pthread, в других билиотеках всяко-разно подобное должно присутствовать.
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 21:36     Взаимодействие между процессами двух приложений #12
я просто только CreateThread знаю и все) поэтому там по-другому ) поэтому и пишу исходя из этого)
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,645
Записей в блоге: 17
30.12.2012, 21:46     Взаимодействие между процессами двух приложений #13
Цитата Сообщение от pavlovnik Посмотреть сообщение
ун можно организовать синхронизацию доступа к файлу.
C помощью крит секций можно только потоки синхронизировать...
Цитата Сообщение от pavlovnik Посмотреть сообщение
я просто только CreateThread знаю и все) поэтому там по-другому ) поэтому и пишу исходя из этого)
А CreateProcess() ?
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 22:10     Взаимодействие между процессами двух приложений #14
ну мы про создание потоков ж а не процессов)
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,645
Записей в блоге: 17
30.12.2012, 23:46     Взаимодействие между процессами двух приложений #15
Ну так тема про процессы: "Взаимодействие между процессами двух приложений"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2012, 14:57     Взаимодействие между процессами двух приложений
Еще ссылки по теме:

Переслать вектор N процессам, используя различные виды связи между процессами (MPI_Alltoall) C++
C++ Взаимодействие между классами
C++ Обмен данными между процессами

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

Или воспользуйтесь поиском по форуму:
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
31.12.2012, 14:57     Взаимодействие между процессами двух приложений #16
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так тема про процессы: "Взаимодействие между процессами двух приложений"
два процесса взаимодействуют) во втором процессе создается несколько потоков для записи в разные файлы. Каждый поток записывает в свой файл) я понял так)
Yandex
Объявления
31.12.2012, 14:57     Взаимодействие между процессами двух приложений
Ответ Создать тему
Опции темы

Текущее время: 13:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru