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

Вниз

Передача данных с помощью сообщений windows   Найти похожие ветки 

 
Zakir   (2007-11-04 16:48) [0]

Если с помощью сообщений Windows (функций PostMessage/PostThreadMessage) передается указатель на какую-нибудь динамически-созданную структуру, например между потоками, то как лучше организовать управление памятью (удаление структуры получателем, после того как она больше не нужна)?


 
homm ©   (2007-11-04 17:51) [1]

> то как лучше организовать управление памятью

Копировать при получении с всою структуру. Удалять в источники сразу поле «посылки» в приемнике — после того, как не нужна.
Но даже если просто тупо сделать «удаление структуры получателем, после того как она больше не нужна», вроде тоже припятствие не должно быть, если пошлеш лишь одному получателю.


 
GlFox ©   (2007-11-05 15:12) [2]

Как пишут в PSDK в описании WM_COPYDATA:
The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.
While this message is being sent, the referenced data must not be changed by another thread of the sending process.
The receiving application should consider the data read-only. The lParam parameter is valid only during the processing of the message. The receiving application should not free the memory referenced by lParam. If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer.


 
MsGuns ©   (2007-11-05 16:05) [3]

>удаление структуры получателем, после того как она больше не нужна

Такая "технология" чревата труднонаходимыми ошибками. "Получатель" должен лишь использовать объект, ссылка на который ему передается, но не решать "судьбу" самого объекта (за исключением специальных случаев)


 
Zakir   (2007-11-06 08:29) [4]

Как известно, PostMessage/PostThreadMessage работают асинхронно.
Послав подобное сообщение, поток уже не может решить судьбу объекта, этим должен заниматься получатель.
Можно конечно использовать глобальную очередь, куда складывать сообщения, но это некрасиво и усложнено, в случае если потоков-получателей несколько.
Видимо, нужен какой-то вариант сборки мусора (может быть объект должен удалять себя сам как в com?).


 
Сергей М. ©   (2007-11-06 10:27) [5]


> этим должен заниматься получатель


Именно так.
И ничто не мешает получателю сделать это корректно и вовремя.


 
Leonid Troyanovsky ©   (2007-11-06 13:50) [6]


> Zakir   (06.11.07 08:29) [4]

> Можно конечно использовать глобальную очередь, куда складывать
> сообщения, но это некрасиво и усложнено, в случае если потоков-
> получателей несколько.

TThreadList спасет ОРД.
Возможно, добавить реакцию потоков на event (Create/SetEvent &etc).

А вот делать все потоки гуевыми - действительно, некрасиво.

--
Regards, LVT.



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

Форум: "Основная";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.046 c
4-1183546348
Виктор007
2007-07-04 14:52
2008.02.10
Запись в файл


15-1199350896
Riply
2008-01-03 12:01
2008.02.10
Помогите "сами мы тут не местным" :)


15-1199611199
sauron
2008-01-06 12:19
2008.02.10
Праздники!


15-1199808776
VAD*Anti Gopn!k
2008-01-08 19:12
2008.02.10
NVIDIA 7600GS


15-1199780453
Anatoly Podgoretsky
2008-01-08 11:20
2008.02.10
Предложения от www.podgoretsky.com





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