Главная страница
    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.049 c
2-1161726522
Kostafey
2006-10-25 01:48
2006.11.12
Работа с датами в MS SQL Server


15-1161574022
Slider007
2006-10-23 07:27
2006.11.12
С днем рождения ! 23 октября


4-1151480576
GelVit
2006-06-28 11:42
2006.11.12
Получение хендла от окна пославшего сообщение?


15-1161948526
alles
2006-10-27 15:28
2006.11.12
Почему без ping-a Windows не видет компютера?


1-1159760661
zsergey
2006-10-02 07:44
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский