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