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

Вниз

Передача строк между потоками приложения   Найти похожие ветки 

 
samum   (2007-02-21 09:26) [0]

Здравствуйте.
Вот встал такой вопрос: в приложении имеется несколько потоков. Каждый из них имеет необходимость передавать строку в главный поток. Пока это реализовано примерно так:

var
 s: string;
 p: pchar;
begin
 self.FreeOnTerminate := true;
 s := "Тестовая строка";
 p := PChar(s);
 PostMessage(Form1.Handle, WM_SAMPLEMESSAGE, integer(p), 0);
end;

Ну, главный поток это ловит и со строкой как с Pchar работает.
Пока проблем не возникало, но вот смутные сомнения меня терзают - не получится ли, что при большом количесвтве таких потоков (учитывая, что каждый из них закрывается после отправки сообщения), в ту область памяти, на которую указывает p будет распределено что-то другое поверх строки? Т.е. вместо строки я получу в главном потоке набор непонятных символов?
Может стоит использовать явно GetMem(p, length(s)+1), а в главном потоке FreeMem вызывать? Подскажите, пожалуйста.


 
MBo ©   (2007-02-21 09:29) [1]

PostMessage не ждет обработки сообщения, поэтому может сложиться ситуация, когда сообщение послано, строка освобождена, а прием состоится позже, и возникнет ошибка обращения к памяти. SendMessage же дождется обработки сообщения, если устроит синхронный режим.


 
evvcom ©   (2007-02-21 09:42) [2]

И судя по всему выдран кусок из метода, где s - локальная переменная. Потому скорее всего в большинстве случаев

> [1] MBo ©   (21.02.07 09:29)
> сообщение послано, строка освобождена, а прием состоится позже

это и происходит, а

> возникнет ошибка обращения к памяти

не происходит по чистой случайности. Видимо, не так часто запрашивается перевыделение памяти.



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

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

Наверх





Память: 0.45 MB
Время: 0.05 c
15-1174223869
eXPell
2007-03-18 16:17
2007.04.15
Функция?!...


15-1174423436
koha
2007-03-20 23:43
2007.04.15
Подскажите программу которая может показать статус драверов


2-1174900751
lobach
2007-03-26 13:19
2007.04.15
Разделители


2-1174503671
sergeyxxx
2007-03-21 22:01
2007.04.15
Народ помогите


15-1174537847
MBo
2007-03-22 07:30
2007.04.15
Художника каждый обидеть может...





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