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

Вниз

Обмен данными между двумя программами через SendMessage   Найти похожие ветки 

 
Apolo   (2004-09-07 15:34) [0]

Здраствуйте мастера.
Есть 2 программы. Они между собой должны обмениваться данными, например текстовыми строками! Хотел сделать через SendMessage, про который почти подробно прочитал здесь: http://delphimaster.net/view/4-1091719149/

Но вот у меня проблема в следующем:
Если программа 2 выполняет чтото большое, и программа в етот момент отправляет ей 2 сообщения, то 1 сообщение теряеться!
Как я понял, тем способом просто 2 сообщение перезаписывает в памяти данные первого сообщения!

Мне нет необходимости обрабатывать сообщения мгновенно, мне подойдет и тогда, когда программа освободиться от длинных циклов!
(Поток честно говоря тоже не хочу организовывать)

Подскажите пожалуйста как бы построить алгоритм, чтоб сообщения не терялись, и обясните пожалуйста "на пальцах" что значит WM_USER+XXX и с чем его едят?

Спасибо.


 
Digitman ©   (2004-09-07 16:16) [1]


> Если программа 2 выполняет чтото большое, и программа в
> етот момент отправляет ей 2 сообщения, то 1 сообщение теряеться


такого не может быть, потому что SendMessage() - синхронная ф-ция


> что значит WM_USER+XXX и с чем его едят


WM_USER - констатнта.
ее значение = 1024

номера сообщений <= 1024 зарезервированы для системных нужд, номера сообщений в диапазоне [1025; 65535] м.б. использованы прикладными задачами

WM_USER+XXX означает, что номер сообщения равен числу, расчитанному как WM_USER (= 1024) плюс некая константа ХХХ, заданная в проекте ... сумма WM_USER и ХХХ не должна превышать 65535


 
Apolo ©   (2004-09-07 16:44) [2]

Спасибо


> такого не может быть, потому что SendMessage() - синхронная
> ф-ция

Убедился, проверив кодом:
Cap := Form1.Edit1.Text;
MyHandle := FindWindow(nil,"Receiver");
if Cap <> "" then
begin
CD.cbData := Length(Cap)+ 1;
CD.lpData := PChar(Cap);
SendMessage(MyHandle , WM_COPYDATA, 0, Longint(@CD));


Еще один вопросик:
В программе, которая принимает сообщения в длинных циклах я вставил Application.ProcessMessages;

procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
for i := 1 to 10 do
begin
Application.ProcessMessages;
Sleep(1000);
end;
end;


Вопрос таков:
Application.ProcessMessages - он приостанавливает цикл и обратывает другие события! Все ли он события обробатывает за 1 раз или на каждый раз срабатывания Application.ProcessMessages обработаеться только одно событие программы?

И вообще есть ли какието альтернативы Application.ProcessMessages-у? Чем он хорош и чем он плохой?

Заранее спасибо!


 
Суслик ©   (2004-09-07 16:49) [3]


> И вообще есть ли какието альтернативы Application.ProcessMessages-у?

есть - не писать длинные циклы в главном потоке, а писать их в дополнительном.


 
Digitman ©   (2004-09-07 16:50) [4]


> Убедился, проверив кодом:


в приведенном коде отправляется всего одно сообщение, так что о потере 1-го при отправке двух сообщений последовательно (и потере при этом "первого") не может идти и речи


> Application.ProcessMessages - он приостанавливает цикл и
> обратывает другие события! Все ли он события обробатывает
> за 1 раз или на каждый раз срабатывания

события и сообщения - две разные разницы
в дан. случае идет речь о сообщениях
Application.ProcessMessages диспетчеризует все сообщения, имевшие место быть в очереди на момент вызова этого метода


 
Анонимщик ©   (2004-09-07 16:52) [5]

В исходнике Forms.pas написано:

procedure TApplication.ProcessMessages;
var
 Msg: TMsg;
begin
 while ProcessMessage(Msg) do {loop};
end;

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
 Handled: Boolean;
begin
 Result := False;
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
   Result := True;
   ...


Из чего следует, что обрабатываются все сообщения. А альтернативы - дело твое личное, смотри исходники и делай что угодно.


 
Apolo ©   (2004-09-07 17:07) [6]

Большое спасибо


> потому что SendMessage() - синхронная


Как я понял - у меня программа будет "висеть" пока другая программа не обработает сообщение, которое первая ей передала!

А есть ли какието другие способы передачи данных между программами? Желательно через память...
(pipe и Socket не подходит)


 
Fay ©   (2004-09-07 17:09) [7]

File-mapping


 
Digitman ©   (2004-09-07 17:10) [8]


> Как я понял - у меня программа будет "висеть" пока другая
> программа не обработает сообщение, которое первая ей передала!


совершенно верно


> А есть ли какието другие способы передачи данных между программами?
> Желательно через память


все прочие "способы" - на совести программера .. с использованием объектов синхронизации, например


 
Apolo ©   (2004-09-07 17:12) [9]


> File-mapping


а можно по подробнее пожалуйста?
буду очень благодарен за ссылочку или приведеный код!


 
Apolo ©   (2004-09-07 17:15) [10]

File-mapping уже все нашел! :-) Спасибо!


 
Fay ©   (2004-09-07 17:32) [11]

не успел 8)


 
Apolo ©   (2004-09-07 17:42) [12]

Прочитал статью на http://www.codersclub.net/articles/229.html

Есть пару вопросов:

Как вторая запущенная программа находит адресное пространство?

Там в коде она создает file-mapping но почему у второй программы они совпадают?


 
Apolo ©   (2004-09-07 18:38) [13]

Обьясните мне пожалуйста - почему в нижеприведенном коде lpBaseAddress одинаково у несколько запущенных екземпляров программ?

procedure TForm1.FormCreate(Sender: TObject);
begin
//создадим FileMapping с именем MySharedValue
//и передадим его хэндл в глобальную переменную hFileMapObj
   hFileMapObj:=CreateFileMapping(MAXDWORD,Nil,PAGE_READWRITE,0,4,"MySharedValue");
   If (hFileMapObj=0) Then
//ошибочка вышла
       ShowMessage("Не могу создать FileMapping!")
   Else
//подключим FileMapping к адресному пространству
//и получим начальный адрес данных
       lpBaseAddress:=MapViewOfFile(hFileMapObj,FILE_MAP_WRITE,0,0,0);
   If lpBaseAddress=Nil Then
//ошибочка вышла
       ShowMessage("Не могу подключить FileMapping!");
end;


 
Suntechnic ©   (2004-09-07 18:41) [14]

Как вторая запущенная программа находит адресное пространство?

Не совсем понятно что имеется ввиду... Наверное автора вопроса интересует как второе приложение получает доступ к уже существующему спроецированному файлу. Ответ: по имени.

Там в коде она создает file-mapping но почему у второй программы они совпадают?

Именно по этому и совпадают.


 
Apolo ©   (2004-09-07 18:50) [15]


> по имени.


ты имеешь ввиду ету строчку:
hFileMapObj:=CreateFileMapping(MAXDWORD,Nil,PAGE_READWRITE,0,4,"MySharedValue");
где имя - "MySharedValue"

Но как можно создать дважды, то, что уже существует? Почему не вылазит у второй программы ошибка? Почему оно просто игнорируеться и в хендл записываеться уже существующий обьект?


 
Suntechnic ©   (2004-09-07 18:55) [16]

Но как можно создать дважды, то, что уже существует? Почему не вылазит у второй программы ошибка? Почему оно просто игнорируеться и в хендл записываеться уже существующий обьект?

В хелп лень заглянуть?

lpName

Points to a null-terminated string specifying the name of the mapping object. The name can contain any character except the backslash character (\).

If this parameter matches the name of an existing named mapping object, the function requests access to the mapping object with the protection specified by flProtect.


 
Apolo ©   (2004-09-08 11:23) [17]

Спасибо всем!

На заметку:
На свои "глупые" вопросы я нашел ответ здесь:
http://ldvroot.narod.ru/OS.pdf


 
Суслик ©   (2004-09-08 11:38) [18]


> Apolo ©   (08.09.04 11:23) [17]


> На заметку:
> На свои "глупые" вопросы я нашел ответ здесь:

А еше лучше искать, например в книге Рихтера.
хорошо вводит в курс дела.


 
Fay ©   (2004-09-08 12:06) [19]

2  [18] Суслик ©   (08.09.04 11:38)
Какой именно книге? У него их много. 8)


 
Суслик ©   (2004-09-08 12:14) [20]

Которая
windows
создание эффективных что-то там
4ое издание

из серии для профессионалов



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

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

Наверх





Память: 0.5 MB
Время: 0.037 c
14-1095594345
DelphiStarter_Irbis1001
2004-09-19 15:45
2004.10.10
TSplitter


1-1095861893
DelphiLexx
2004-09-22 18:04
2004.10.10
Получить сообщения окна, зная Handle


14-1095927192
REP
2004-09-23 12:13
2004.10.10
Что такое поддержка MPEG4 в TV тюнерах?


9-1084737397
Жириновский_
2004-05-16 23:56
2004.10.10
как лучше сделать бой в рпг?


6-1091112535
qwerty2
2004-07-29 18:48
2004.10.10
HTTP запрос с помощью ClientSocket





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский