Форум: "Основная";
Текущий архив: 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.049 c