Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2006.12.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
3-1160374486
svt
2006-10-09 10:14
2006.12.17
Уважаемые мастера, подскажите как правильно выполнить запрос


2-1164866515
Silica
2006-11-30 09:01
2006.12.17
Очистка формы


2-1164978170
.ruslan
2006-12-01 16:02
2006.12.17
PageScroller убрать кнопки прокрутки и использовать колёсик мыши


2-1164700360
DelphiLexx
2006-11-28 10:52
2006.12.17
DBGridEh и DoubleBuffered


3-1160504139
Kolan
2006-10-10 22:15
2006.12.17
Что почитать по работе с MS SQL Server в Delphi?