Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Взаимодействие программ

1.8K
06 декабря 2007 года
CilCatblack
251 / / 20.09.2007
1.Как создать два приложения MS DOS одновременно исполняющихся
под Windows и взаимодействующих между собой на уровне файлов?
2.Как создать приложение Windows c двумя одновременно взаимодействующих между собой процессами на уровне сообщений?
Нужно срочно! H-e-l-p!!!!
Если можно с кодом и примером. Please H-e-l-p!!!!
397
06 декабря 2007 года
SergPas
527 / / 03.02.2007
Цитата:
Как создать приложение Windows c двумя одновременно взаимодействующих между собой процессами на уровне сообщений?


Может быть речь идёт о двух приложения Windows, взаимодействующих между собой, или о двух и более потоках, порождённых одним процессом Windows? Уточните задачу...

1.8K
06 декабря 2007 года
CilCatblack
251 / / 20.09.2007
Уточняю:
2.Приложение одно.
Речь идет о двух процессах.
Два процессах взаимодействуют между собой, на уровне сообщений.:o


А первое никто не знает??? :( :( :(---SOS! SOS!
397
06 декабря 2007 года
SergPas
527 / / 03.02.2007
Цитата:
Уточняю:
2.Приложение одно.
Речь идет о двух процессах.
Два процессах взаимодействуют между собой, на уровне сообщений.


STOP!!!
В рамках одного процесса существует одно приложение! В тоже время процесс может порождать другой процесс! Процесс помимо того, что имеет основной поток, может порождать дочерние потоки.
Взаимодействие 2-х приложений осуществляется путём посылки сообщений функцией

 
Код:
SendMessage(hWnd: HWND; msg: Cardinal; wParam: integer; lParam: integer): integer;

Если же требуется синхронизировать данные и код двух потоков, то используются такие объекты ядра, как критические секции, мьютексы, события, семафоры и т.д.
Вот всё решение второй задачи!
1.9K
06 декабря 2007 года
max_dark
256 / / 11.11.2005
1. Приложения именно досовские или имеется в виду консольные под Win?
2. Видимо идет речь о программе, запускающей свою копию(одно приложение - два процесса)
Вот процедура запуска:
Код:
procedure RunCopyOfSelf(hApp:HINST);
    var
        si:STARTUPINFO;
        pi:PROCESS_INFORMATION;
        path:array [0..MAX_PATH] of char;
begin
    GetModuleFileName(hApp, path, MAX_PATH); // Получаем имя своего файла
    ZeroMemory(@si,sizeof(STARTUPINFO));
    si.cb=sizeof(STARTUPINFO);
    CreateProcess(path, nil, nil, nil, false,0, nil, nil, si, pi);
end;
397
06 декабря 2007 года
SergPas
527 / / 03.02.2007
Цитата:
2. Видимо идет речь о программе, запускающей свою копию(одно приложение - два процесса)


Управлять второй копией программы? Не бред ли? Как правило создаются программистом две программы - клиентская и серверная, которые и взаимодействуют через механизм синхронизации. Смысл программы, которая взаимодействует сама с собой?

1.9K
06 декабря 2007 года
max_dark
256 / / 11.11.2005
Возможно и бред. Но я лично недавно делал подобную лабу: первая копия рассчитывает инфу, вторая ее выводит
Смысл? Обучение взаимодействию процессов.
1.8K
07 декабря 2007 года
CilCatblack
251 / / 20.09.2007
Цитата: max_dark
1. Приложения именно досовские или имеется в виду консольные под Win?


Крнечно же консольные под Windows!!!:)

1.8K
08 декабря 2007 года
CilCatblack
251 / / 20.09.2007
max_dark вторая задача получилась благодаря тебе.Спасибо!

Кто нибудь помогите с этим:
1.Как создать два приложения MS DOS одновременно исполняющихся
под Windows(приложения консольные) и взаимодействующих между собой на уровне файлов?:confused: :confused:
1.9K
09 декабря 2007 года
max_dark
256 / / 11.11.2005
Если взаимодействие именно через файлы(а не FileMapping или перенаправление ввода/вывода), то алгоритм примерно следующий

Первая программа пишет данные в файл(ну для примера)
Код:
{Файл Project1.dpr}
program Project1;


uses
  Windows,
  shared in 'shared.pas';

var
        s:String;
        f:TextFile;
begin
    repeat
        Write('Enter command: '); ReadLn(s); // Вводим данные
        if s = '' then s:='exit';
        AssignFile(f, fname);
        // Записываем в файл
        if GetFileAttributes(PAnsiChar(fname)) <> $FFFFFFFF then
            Append(f)
        else
            ReWrite(f);
        WriteLn(f, s);
        CloseFile(f);
    until (s = 'exit');
end.
{Файл shared.pas}
unit shared;

interface
    const
        fname = 'hello.txt';
implementation
end.

Вторая программа проверяет файл на изменения(допустим по времени последнего обращения к файлу), если он изменился то считываем его
Код:
{Файл Project2.dpr}
program Project2;

{$APPTYPE CONSOLE}

uses
    Windows,
    shared in 'shared.pas';
    var
        old : _FILETIME;
        att : WIN32_FILE_ATTRIBUTE_DATA;
        s:string;
        f:TextFile;
begin
    if GetFileAttributesEx(PAnsiChar(fname),GetFileExInfoStandard,@att) = FALSE then begin
        exit;
    end;
    old:=att.ftLastWriteTime;
    repeat
        Sleep(200);
        GetFileAttributesEx(PAnsiChar(fname),GetFileExInfoStandard,@att);
        if ((old.dwLowDateTime <> att.ftLastWriteTime.dwLowDateTime) or
            (old.dwHighDateTime <> att.ftLastWriteTime.dwHighDateTime))then begin
            AssignFile(f, fname);
            Reset(f);
            WriteLn('+----------------------------------------+');
            while not eof(f) do begin
                ReadLn(f,s); WriteLn(s);
            end;
            CloseFile(f);
            old:=att.ftLastWriteTime;
        end;
    until s = 'exit';
end.
1.8K
10 декабря 2007 года
CilCatblack
251 / / 20.09.2007
Спасибо всем! Теперь зазобрался!:D
Особые благодарности max_dark:D :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог