Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Вниз

Связь с порождаемым процессом   Найти похожие ветки 

 
shake-c   (2006-07-19 12:00) [0]

Всем добрый день !!
Вопрос такой: Порождается дочерний процесс (Create process),
Дочерний процесс в процессе работы должен "посылать" сигналы (данные) основному процессу. Как лучше реализовать
обработку принятых данных и приём?
Дочерние процессы создаются не на Delphi. И в их исходник
желательно вносить поменьше дополнений

Заранее большое спасибо


 
medved_68 ©   (2006-07-19 12:21) [1]


> Дочерний процесс в процессе работы должен "посылать" сигналы
> (данные) основному процессу. Как лучше реализовать
> обработку принятых данных и приём?

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


 
GrayFace ©   (2006-07-19 19:01) [2]

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

medved_68 ©   (19.07.06 12:21) [1]
передачей указателя на область памяти где эти данные лежат

Чушь. Почитай про адресные пространства.


 
Leonid Troyanovsky ©   (2006-07-19 23:17) [3]


> shake-c   (19.07.06 12:00)  

> Дочерний процесс в процессе работы должен "посылать" сигналы
> (данные) основному процессу. Как лучше реализовать


Если дочерние процессы используют станд. ввод/вывод,
то можно передать им хендлы anonymous pipe(s).

--
Regards, LVT.


 
Slym ©   (2006-07-20 04:59) [4]

Если дочка консольная... Лучше StdIn/Out ничего не создали
в CreateProcess пайпы передай дочка будет их юзать вместо консоли... в главном приложении ReadFile/Writefile


 
GrayFace ©   (2006-07-21 00:42) [5]

Ошибся - MMF + мьютекс недостаточно. Нужно MMF + 2 события.


 
shake   (2006-07-25 06:35) [6]


> Если у дочернего процесса предполагается наличие окон, то
> можно организовать обмен на сообщениях.

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


 
Slym ©   (2006-07-25 06:44) [7]

В демках Demos\Ipcdemos


 
Джо ©   (2006-07-25 06:47) [8]

> [6] shake   (25.07.06 06:35)
>
> > Если у дочернего процесса предполагается наличие окон,
> то
> > можно организовать обмен на сообщениях.
>
> У дочерних процессов предполагается наличие окон. Как организовать
> обмен на сообщениях ? Может быть у кого то есть примеры,
> буду очень признателен.

Для таких целей предназначено сообщение WM_COPYDATA. Сейчас уже недосуг написать простой пример или даже выдрать что-то из готовых исходников. Думаю, слегка погуглив по названию сообщения, минут за 10 найдешь пример и сам :)


 
user51   (2006-07-25 15:46) [9]

Нашел пример:
Функция посылает окну строку (с дополнительным любым числом) синхронно через WM_COPYDATA. Можно и другому приложению.

function SendIPCString(TargetWnd, SourceWnd: THandle;
dwData: integer; const S: string): integer;
var CD: TCopyDataStruct;
begin
 CD.dwData := dwData; CD.cbData := Length(S);
 if CD.cbData = 0  then CD.lpData := NIL else CD.lpData := @S[1];
 Result := SendMessage(TargetWnd, WM_COPYDATA, SourceWnd, integer(@CD));
end;

а в принимающей программе какой код должен быть ???
ПОМОГИТЕ если знаете. Или дайте какой нибудь пример
P.S. если б знал не спрашивал.


 
shake   (2006-08-01 13:12) [10]

я наткнулся на такой код:

// Sender: Send data
procedure TForm1.Button1Click(Sender: TObject);
var
  aCopyData: TCopyDataStruct;
  hTargetWnd: HWND;
begin
  with aCopyData do
  begin
    dwData := 0;
    cbData := StrLen(PChar(Edit1.Text)) + 1;
    lpData := PChar(Edit1.Text)
  end;
  // Search window by the window title
 hTargetWnd := FindWindowEx(0, 0, nil, PChar(′WM_COPYDATA-Receiver′));
  if hTargetWnd <> 0 then
    SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData))
  else
    ShowMessage(&#8242;No Recipient found!&#8242;);
end;

(* -------------------------------------------------------------------- *)

// Recipient - Receive data
type
  TForm1 = class(TForm)
    private
    { Private declarations }
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
  public
    { Public declarations }
  end;

procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
  sText: array[0..99] of Char;
begin
  // generate text from parameter
   StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  // write received text
 label1.Caption := sText;
end;

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


 
Сергей М. ©   (2006-08-01 13:16) [11]


> shake   (01.08.06 13:12) [10]


> не понянто как вызывать последнюю процедуру


Какую такую "последнюю" ? procedure TForm1.WMCopyData - эту что ли ?
Это не процедура, а метод объекта.
Вызывать ее не надо - она будет вызвана и без твоего участия.


 
GrayFace ©   (2006-08-02 03:48) [12]

Конкретно, она будет вызвана, если окну прийдет сообщение WM_COPYDATA.


 
shake   (2006-08-02 06:25) [13]

Все понял. у меня был косяк в строке
hTargetWnd := FindWindowEx(0, 0, nil, PChar("WM_COPYDATA-Receiver"));
тут главное вместо "WM_COPYDATA-Receiver" правильный кэпшен формы-
получателя задать.
Теперь все заработало. Всем спасибо 8 )



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
15-1164770892
Slider007
2006-11-29 06:28
2006.12.17
С днем рождения ! 29 ноября


15-1164372798
grisme
2006-11-24 15:53
2006.12.17
легкий по весу GUI


15-1164498423
eRoR_rrr
2006-11-26 02:47
2006.12.17
Посоветуйте простенький IRC server под Win


15-1163315217
SergP
2006-11-12 10:06
2006.12.17
ICQ-сервер. Где взять?


15-1164317188
KilkennyCat
2006-11-24 00:26
2006.12.17
Пытаюсь придумать варианты, когда такое нужно:





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский