Текущий архив: 2004.10.10;
Скачать: CL | DM;
Вниз
Обмен данными между двумя программами через 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 вся ветка
Текущий архив: 2004.10.10;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.026 c