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

Вниз

Передача данных в сообщении (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.049 c
6-1150754439
YuraKiller2
2006-06-20 02:00
2006.11.12
Работа с удалённой базой


15-1161934086
Некто
2006-10-27 11:28
2006.11.12
Посоветуйте антивирус


15-1161646125
Германн
2006-10-24 03:28
2006.11.12
Все спят, а я балдею под JMJ


15-1161607601
Vitality
2006-10-23 16:46
2006.11.12
Работа с таблицей Exel


15-1161626515
Layner
2006-10-23 22:01
2006.11.12
А кто знает, как троллейбусы перекл. с ветки на ветку?