Главная страница
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.058 c
2-1161991908
Jus
2006-10-28 03:31
2006.11.12
Забыл как переименовать Unit1


15-1161417911
vidiv
2006-10-21 12:05
2006.11.12
Посоветуйте: как реализовать -


2-1162117932
Серый
2006-10-29 13:32
2006.11.12
Memo,ListBox,ComboBox


2-1162103253
Max.66RUS
2006-10-29 09:27
2006.11.12
Вопрос про CheckBox...


6-1150630488
Прогер
2006-06-18 15:34
2006.11.12
Есть ли данные для чтения? idTCPClient