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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2011, 19:41   #1
ReGreed
 
Регистрация: 26.05.2011
Сообщений: 5
По умолчанию Обмен данными между двумя процессами

Добрый день/вечер.

Усердно слушал преподавателя на паре, прошуршал много литературы дома, но так и не понял, как заюзать обмен данными между двумя запущенными одинаковыми процессами.

Что хочу сделать: запускаем одну и ту же программу два раза, пишем в окне первой программы какую-либо информацию и она автоматически ловится вторым окном. И наоборот. Если всё правильно понял, то будет проще сделать поочерёдный ввод, нежели произвольный.

Честно скажу, что не могу понять, с чего начать. Мне не нужен полностью рабочий код, но некоторые кусочки очень бы помогли.

На данный момент понял только как юзать ивенты внутри одного процесса. Код ниже.

Код:
#include <windows>
#include <process>
#include <iostream>

using namespace std;

HANDLE hEvent1, hEvent2;

void Thread(void* pParams){
     
     while(TRUE){
                 WaitForSingleObject(hEvent2, INFINITE); //ждём активации второго события
                 cout<<"DVA ";
                 //SetEvent(hEvent1);
     }
}

int main(void){
    hEvent1=CreateEvent(NULL, FALSE, TRUE, NULL); //первое событие активировано
    hEvent2=CreateEvent(NULL, FALSE, FALSE, NULL); //второе событие деактивировано
    
    _beginthread(Thread, 0, NULL);
    
    while(TRUE){
                WaitForSingleObject(hEvent1, INFINITE); //ждём активации первого события. оно уже активно, поэтому выполняем дальнейший код.
                cout<<"ODIN ";
                SetEvent(hEvent2); //активируем второе событие. первое автоматически деактивируется?
    }
    return 0;
}
Буду благодарен за любые ссылки/пояснения/советы/обоснованную ненависть в мою сторону.
ReGreed вне форума Ответить с цитированием
Старый 26.05.2011, 19:56   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

ивенты должны быть именованные, чтобы их можно было найти в другом процессе
для обмена данными проще всего, имхо, использовать mapped memory (опять же, именованную)
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.05.2011, 20:00   #3
ReGreed
 
Регистрация: 26.05.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
ивенты должны быть именованные
Разве я им не задал имена hEvent1 и hEvent2? Ну раз ты так говоришь, значит я не задал. Как будет правильней это сделать?
Цитата:
Сообщение от veniside Посмотреть сообщение
чтобы их можно было найти в другом процессе
Допустим задал я имя. В какой момент на него надо ссылаться и как это сделать?
Цитата:
Сообщение от veniside Посмотреть сообщение
для обмена данными проще всего, имхо, использовать mapped memory (опять же, именованную)
Насчёт этого я ничего не видел/не слышал/не читал, так что в моём случае это будет не проще =)

Опять же извиняюсь за свою безграмотность в этом деле. Искренне надеюсь на Вашу помощь.
ReGreed вне форума Ответить с цитированием
Старый 27.05.2011, 01:48   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Разве я им не задал имена hEvent1 и hEvent2?

это, конечно, так, но я про последний параметр lpName в функции CreateEvent()

> на него надо ссылаться и как это сделать?

вызвать CreateEvent() с тем же значением lpName. логично?

> ничего не видел/не слышал/не читал

ну это легко исправить. По сути, это просто кусок памяти, к которому могут обращаться несколько процессов.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.05.2011, 08:48   #5
ReGreed
 
Регистрация: 26.05.2011
Сообщений: 5
По умолчанию

Так, я тут кое с чем сам разобраться смог. Остался, надеюсь, последний вопрос: как проверить статус события?

Мне надо, чтобы при TRUE производилось одно действие, а при FALSE другое. К сожалению, не знаю как проверить этот статус.

Я бы с радостью погуглил, да не могу по-человечески сформулировать запрос.

Заранее спасибо за огромную помощь и извините за моё нубство +)
Код:
#include <windows.h>
#include <process.h>
#include <iostream>

using namespace std;

HANDLE hEvent1, hEvent2, hEvent3;

class clChat{
      public:
             clChat();
             void first();
             void second();
             char message[100];
};

clChat::clChat(){};

void clChat::first(){
     SetEvent(hEvent3);
     while(TRUE){
                 WaitForSingleObject(hEvent1, INFINITE);
                 cout<<"Type your message1: ";
                 cin>>message;
                 SetEvent(hEvent2);
     }
};

void clChat::second(){
     while(TRUE){
                 WaitForSingleObject(hEvent2, INFINITE);
                 cout<<"Type your message2: ";
                 cin>>message;
                 SetEvent(hEvent1);
     }
};

int main(void){
    hEvent1=CreateEvent(NULL, FALSE, TRUE, "hEvent1");
    hEvent2=CreateEvent(NULL, FALSE, FALSE, "hEvent2");
    hEvent3=CreateEvent(NULL, FALSE, FALSE, "hEvent3");
    
    class clChat use;
    /*в этом месте должна быть проверка статуса третьего ивента.
    Если он TRUE, то идём на функцию second. если FALSE, то идём
    на функцию first.
    
    Запускаем программу первый раз, она проверяет статус события hEvent3 - он
    в положение FALSE. Следовательно, программа запустилась первый раз.
    Значит в ней будет работать только функция first.
    
    Запускаем программу второй раз, она проверяет статус события hEvent3 - он
    уже в положении TRUE. Следовательно, программа запустилась второй раз.
    Значит в ней будет работать только функция second.*/
    
    system("pause");
    return 0;
}
if(hEvent3.bInitialState==true){};
Так будет правильно?

Последний раз редактировалось ReGreed; 27.05.2011 в 12:55.
ReGreed вне форума Ответить с цитированием
Старый 27.05.2011, 13:06   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> не знаю как проверить этот статус

Код:
if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent3, 1)) {
  // signaled (событие установлено)
}
else {
  // not signaled (сброшено)
}
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.05.2011, 15:31   #7
ReGreed
 
Регистрация: 26.05.2011
Сообщений: 5
По умолчанию

Огромное спасибо. Очень приятно, что не всем наплевать.
ReGreed вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обмен данными между формами viktory Помощь студентам 3 19.10.2009 22:59
Обмен данными между двумя формами в Delphi NecroSlider Помощь студентам 2 30.07.2009 11:52
Обмен данными между С++ и С# Stellvertreter Общие вопросы C/C++ 0 14.11.2008 14:18
Обмен данными между формами Maks1978 Общие вопросы C/C++ 3 22.07.2008 15:35
Обмен данными между формами Demien Общие вопросы Delphi 14 23.04.2008 22:04