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

Вниз

Передача данных в сообщении (SendMessage / PostMessage)   Найти похожие ветки 

 
fs_more   (2006-09-24 18:00) [0]

В программе два потока, основной для VLC и дополнительный. Есть необходимость передавать данные из дополнительного потока в основной. Выбран способ с использованием асинхронных сообщений PostMessage().
Структура данных определена как:
TStrArr = array of string;
Массив этого типа определен, создается и уничтожается в основном потоке. Запись данных производится в дополнительном потоке.

Как передать данные в сообщении?

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


 
fs_more   (2006-09-24 18:30) [1]

Еще важный момент:
Доп поток будет слать эти сообщения пачками, одно за другим. Если передавать в wParam / lParam просто адреса на массивы TStrArr, то придется ее обслуживать (контролировать актуальность и блокировать перезапись пока главный поток не обработал данные), т.к. данные по факту не храняться в сообщении Msg...


 
Юрий Зотов ©   (2006-09-24 19:13) [2]

Есть несколько иной вариант архитектуры. ИМХО, проще и надежнее.

Каждый массив формируется отдельным экземпляром потока. Заполнив его, поток передает его адрес главному потоку (через сообщение или через какое-либо свойство Sender"а в OnTerminate), завершается и самоуничтожается. Обработав полученную порцию данных, главный поток уничтожает ее.


 
fs_more   (2006-09-24 19:50) [3]

Юрий Зотов

существование только одного доп потока - неприменное условие.
а вот что касается темы "доп поток создал -- основной отработал и освободил" -- то это мысль хорошая, спасибо :) вот только как хранить такие созданные, но еще не обработанные массивы? наперед ведь неизвестно их количество...


 
Юрий Зотов ©   (2006-09-24 19:54) [4]

> fs_more   (24.09.06 19:50) [3]

Очередь. Доп. поток дописывает сообщение в ее конец, основной выбирает сообщение из ее начала, обрабатывает и уничтожает. Реализовать можно на обычном TList.


 
fs_more   (2006-09-24 19:59) [5]

в итоге имеет две очереди с данными: одна для доп потока, вторая с результатами - для основного. :(
это и хотелось избежать применив SendMessage / PostMessage...

пришли к началу проблемы


 
Юрий Зотов ©   (2006-09-24 20:03) [6]

> fs_more   (24.09.06 19:59) [5]

Если я правильно понял задачу, то очередь одна. Доп. поток формирует массив и передает его адрес через сообщение, а основной поток, получив это сообщение, ставит массив в хвост очереди.


 
fs_more   (2006-09-30 22:25) [7]

Могу сказать, что проблема в общем-то решена. Самым простым и очевидным способом: доп. поток по факту выполнения с помощью PostMessage() шлет сообщения с индексами заданий, которые выполнены. По этим данным VCL поток выполняет необходимые действия с визуальными компонентами.
Данные из доп. потока в основной передаются копированием массива (да, долго, но зато не надо париться с действительностью указателей) по факту прихода сообщения об окончании операции. Чтобы данные в доп. потоке не были потеряны, они блокируются спецю флагом, после считывания в VCL потоке флаг снимается.

Всем участвовавшим в обсуждении спасибо.


 
isasa ©   (2006-10-01 01:50) [8]

fs_more  (30.09.06 22:25) [7]
Самым простым и очевидным способом: доп. поток по факту выполнения с помощью PostMessage() шлет сообщения
...
Данные из доп. потока в основной передаются копированием массива
....
Чтобы данные в доп. потоке не были потеряны, они блокируются спецю флагом, после считывания в VCL потоке флаг снимается.


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



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

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

Наверх





Память: 0.46 MB
Время: 0.04 c
1-1159617913
Diss
2006-09-30 16:05
2006.11.12
Отправка Смс-сообщений через телефон, подключенный к ком-порт


2-1161854032
Делфи
2006-10-26 13:13
2006.11.12
Сохранение


15-1161948265
MikePetrichenko
2006-10-27 15:24
2006.11.12
Требуется программист


15-1161767460
Elen
2006-10-25 13:11
2006.11.12
Можно ли войти в нерасшаренную папку


2-1161943090
markers
2006-10-27 13:58
2006.11.12
Как проверить существования объекта?





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