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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
San-ch
1 / 1 / 1
Регистрация: 03.03.2011
Сообщений: 43
#1

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

30.12.2012, 06:10. Просмотров 1029. Ответов 15
Метки нет (Все метки)

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

Текст задания:
Исследовать возможность создания двух приложений. Процессы, образованые после активации приложений, взаимодействуют между собой. Первое приложение содержит открытый файл Ф11 для считывания данных. Второе приложение считывает данные из файла первого приложения и по очереди передаёт их в файлы Ф21, Ф22, Ф23. Каждый из них открыт в своём отдельном потоке. ... Синхронизация с помощью критической секции, мьютекса, семафора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2012, 06:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Взаимодействие между процессами двух приложений (C++):

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

Канал между процессами - C++
Задача у программы такова. Имеется основная программа(main) и две дополнительных(prc1 и prc2). В prc1 и prc2 стоит прогресс бар, который...

Обмен данными между процессами - C++
При создании дочернего процесса при помощи функции BOOL CreateProcess ( LPCTSTR lpApplicationName, // имя...

Обмен данными между процессами - C++
Уважаемое сообщество, подскажите, пожалуйста, с решением такой проблемы: у меня два процесса c# и с++, и мне необходимо передавать массив...

Обмен данными между процессами - C++
Добрый день! Нужно распараллелить программу. Суть в следующем: должны быть два процесса(разные функции), идущих параллельно, и второй...

Обмен данными между двумя процессами - C++
Добрый день/вечер. Усердно слушал преподавателя на паре, прошуршал много литературы дома, но так и не понял, как заюзать обмен данными...

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

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

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

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


Теперь по синхронизации. Тут особо ничё синхронизировать и не надо- считывай себе и всё. Если бы стояла задача: один поток читает до позиции X, второй с позиции X до позиции Y, третий с позиции Y до позиции Z- то есть если бы работа одного потока зависела от результата работы другого- надо было бы синхронизровать. А тут каждый поток может считывать пока всё не считает и ничего о другом потоке не знать. Куда тут синхронизацию запихать? Не нужна она.
так информация передается по очереди же. я не помню как работать с файлом, просто пример с массивом приведу, вот есть массив из 10 символов, вот первый поток передает первый символ, второй второй и т.д., вроде нормально, но поток же меняет счетчик, и если оба изменят, все- неверно будет.
может надо будет передавать информацию по строкам? может такая же ситуация быть?
ну или вариант передать файл полностью, то есть пока первый поток не отработает, не передаст, второму потоку нельзя обратится к файлу, вдруг там что-то изменится и т.д.
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
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) ; 
}
ну в общем все потоки считывают файл полностью не заботясь друг о друге как я и предполагал; чё тут за синхронизация может быть, остаётся загадкой.
0
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 13:29 #7
значит я что-то не понимаю. Потоков несколько, они поочередно передают в файлы! А как соблюдать очередь без синхронизации? пока один поток всю информацию из файла не передаст в другой файл, следующий поток не может начать работу( по заданию а не по факту). А то создашь потоков и они будут параллельно выполняться.
при работе с общими файлами всегда нужна синхронизация.
А если у него программа делает так, что информацию передается,а пользователь взял и изменил её. Тогда уже следующий поток будет измененную информацию передавать, а ставишь синхронизацию, что не изменять, пока до конца не передаст или в это роде, чтобы все логично было. может так? для нас все равно условия загадка)

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

Цитата Сообщение от pavlovnik Посмотреть сообщение
пока один поток всю информацию из файла не передаст в другой файл, следующий поток не может начать работу( по заданию а не по факту)
И опять- ну какая тут синхронизация? Последовательно потоки включаешь и всё на этом. Можно, конечно, придумать чтобы поток по окончании считывания сигнализировал об этом- семафор там мьютекс или ещё что. Наверное так и надо сделать.
0
Avazart
Нарушитель
Эксперт С++
7226 / 5398 / 291
Регистрация: 10.12.2010
Сообщений: 23,931
Записей в блоге: 17
30.12.2012, 15:39 #9
Цитата Сообщение от San-ch Посмотреть сообщение
Синхронизация с помощью критической секции, мьютекса, семафора.
Процессы как я помню нельзя синхронизировать с помощью критических секций - только потоки.

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

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

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


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

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

Оба для считывания, нужна ли тут синхронизация ?
ун можно организовать синхронизацию доступа к файлу.
0
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,481
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, в других билиотеках всяко-разно подобное должно присутствовать.
0
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 21:36 #12
я просто только CreateThread знаю и все) поэтому там по-другому ) поэтому и пишу исходя из этого)
0
Avazart
Нарушитель
Эксперт С++
7226 / 5398 / 291
Регистрация: 10.12.2010
Сообщений: 23,931
Записей в блоге: 17
30.12.2012, 21:46 #13
Цитата Сообщение от pavlovnik Посмотреть сообщение
ун можно организовать синхронизацию доступа к файлу.
C помощью крит секций можно только потоки синхронизировать...
Цитата Сообщение от pavlovnik Посмотреть сообщение
я просто только CreateThread знаю и все) поэтому там по-другому ) поэтому и пишу исходя из этого)
А CreateProcess() ?
0
pavlovnik
41 / 22 / 4
Регистрация: 07.12.2011
Сообщений: 114
30.12.2012, 22:10 #14
ну мы про создание потоков ж а не процессов)
0
Avazart
Нарушитель
Эксперт С++
7226 / 5398 / 291
Регистрация: 10.12.2010
Сообщений: 23,931
Записей в блоге: 17
30.12.2012, 23:46 #15
Ну так тема про процессы: "Взаимодействие между процессами двух приложений"
0
30.12.2012, 23:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2012, 23:46
Привет! Вот еще темы с ответами:

Обмен данными между процессами в консольных приложениях - C++
Привет. Можно ли как - то обмениваться данными между двумя запущенными консольными приложениями без WinAPI и без использования файлов...

Обмен данными между процессами с помощью файлов, которые отображаются в память - C++
Классическая задача &quot;читатели-писатели&quot;, обмен информацией должен проходить с помощью файлов, отображаемых в память. Задание уже готово, но...

Переслать вектор N процессам, используя различные виды связи между процессами (MPI_Alltoall) - C++
Переслать вектор, размерности M, N процессам, используя различные виды связи между процессами. Элементы вектора задаются произвольно....

Взаимодействие между классами - C++
При попытке создать указатель на объект класса в public секции другого класса из которого будет обращение к его методу... Cook *cok ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru