powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / отправить сообщение "главному потоку" из "дочернего"
25 сообщений из 77, страница 1 из 4
отправить сообщение "главному потоку" из "дочернего"
    #39623530
неглавный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пишется простенький DCOM-сервис с использованием midas'а.
в нем фабрикой создаются экземпляры класса TDCOMmodule = class(TRemoteDataModule, IMyServ)
при этом, у этого сервиса есть ещё и GUI-окно, оно же MainForm.
мне нужно из экземпляра класса TDCOMmodule отправить сообщение этому окошку.

если использовать из потока в котором живёт TDCOMmodule вызов
Код: pascal
1.
PostMessage(MainForm.Handle, WM_USER + XXX, WParam, LParam)

это будет безопасно?
нет ли подводных камней?
или есть что-то более правильное для передачи информации "главному потоку"?
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623536
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неглавныйэто будет безопасно?

Это будет настолько безопасно насколько программист понимает что делает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623540
неглавный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovнеглавныйэто будет безопасно?Это будет настолько безопасно насколько программист понимает что делает.ну, я не настоящий сварщик, я только учусь.
если тут есть где споткнуться, подскажите пожалуйста.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623543
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неглавный,

Посмотри код wadman`a в соседней, недавно поднятой ветке.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623557
неглавный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMasterПосмотри код wadman`a в соседней, недавно поднятой ветке.это там где 17 страниц ветка?
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623564
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неглавный,

а в качестве WParam, LParam что отправляешь?
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623597
Олег Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неглавный,
В межпоточном обмене основных подводных камней - два: синхронизация и время валидности параметров, переданных по сслылке.
PostMessage - потокобезопасен. Ты положил сообщение в очередь и пошел дальше.
Если ты будешь передавать некие значения, которые влезут по размеру wParam и lParam, то это безопасно.
Если же тебе надо передать что-то большее(доблы, строку, структуру, объект), то нужно озаботиться валидностью экземпляра и его потобезопасностью на момент выборки сообщений. Как - зависит от твоих хотелок и задумок.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623617
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег ТретьяковPostMessage - потокобезопасен.
имхо, как раз PostMessage, потокоНЕбезопасен, если ты передаешь указатель, валидность которого будет потеряна к моменту, когда он будет извлечен из очереди сообщений для обработки основным потоком.
А вот SendMessage, наоборот, не даст потоку продолжиться дальше (и завершиться), пока сообщение не будет обработано.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623621
Олег Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокОлег ТретьяковPostMessage - потокобезопасен.
имхо, как раз PostMessage, потокоНЕбезопасен, если
Это персональные тонкости мировосприятия или уже устал и не вник?
Олег Третьяковто нужно озаботиться валидностью экземпляра и его потобезопасностью на момент выборки сообщений. - для способа с PostMessage
Он может уже и не нужен в контексте потока - обработался, выплюнулся.
Допустима и\или нужна блокировка потока-исполнителя? Ну дык и SendMessage в руки. Ты телепат? Я - нет.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623622
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокОлег ТретьяковPostMessage - потокобезопасен.
имхо, как раз PostMessage, потокоНЕбезопасен, если ты передаешь указатель, валидность которого будет потеряна к моменту, когда он будет извлечен из очереди сообщений для обработки основным потоком.
А вот SendMessage, наоборот, не даст потоку продолжиться дальше (и завершиться), пока сообщение не будет обработано.

Во-первых, никто не мешает испортить валидность после SendMessage. Дурковать так дурковать.
Во-вторых - нафига такие multi-threaded приложения, если вызывающая нить будет ждать завершения задания в вызываемой.
В третьих, да, случаи могут быть разными, к чему такая категоричность.
В четвертых, SendMessage из другой нити не просто блокируется в ожидании ответа, а в процессе ожидания продолжает обрабатывать некоторые входящие сообщения и получить удивительное поведение в отдельных случаях. Если ты, конечно, не вызывал SendMessageTimeout с SMTO_BLOCK, о чем ты не упомянул.

В пятых, PostMessage как апишная функция MS Windows- потокобезопасен.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623714
неглавный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за пояснения. Картина проясняется.
Передавать планмруется небольшие структуры по ссылке.
Поясните пожалуйста, почему ссылка может стать невалидной?
Как этого избежать?
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623716
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неглавныйСпасибо всем за пояснения. Картина проясняется.
Передавать планмруется небольшие структуры по ссылке.
Поясните пожалуйста, почему ссылка может стать невалидной?
Как этого избежать?
Глупости, не обращай внимания.
...
Тред-передатчик: в куче выделяет память под структуру. Копирует в выделенную память нужные данные.
Передает ссылку в другую нить (например так, как ты собирался). После обработки данных, тред-приемник освобождает память, ссылку на которую ему передал передали.
Возможные глюки: очередь сообщений не бесконечная, если приемник не будет успевать обработать - сообщения потеряются.
Если структура крошечная, не более размера параметров сообщения - передавай данные прямо в параметрах, без ссылки.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623722
неглавный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. :)
Структурые небольшие, но в параметры не влезут.
Какой менеджер памяти нужно использовать:
достаточно стандартного Дельфийского, или нужно Виндовый?
Интенсивность передачи оных сообщений невелика.
Переполнение очереди маловероятно.
Да и ценность сообщений тоже не критична - по большей части информационная.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623725
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неглавный,
любой менеджер, лишь бы выделение памяти и освобождение в одном и том же делалось.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623727
неглавный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД, спасибо!
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623807
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
    synchronize(
      procedure begin
        // любой код, выполняемый в главном потоке приложения
      end);


Тоже безопасно... Иногда не без удовольствием пользуюсь им :)
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39623816
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TThreadedQueue<T>
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39624593
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДВ пятых, PostMessage как апишная функция MS Windows- потокобезопасен.
Каким макаром?
чччДнеглавный,
любой менеджер, лишь бы выделение памяти и освобождение в одном и том же делалось.
Ерунда. Выделил в одном потоке, переслал второму, тот получил и удалил
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39624645
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Ерунда. Выделил в одном потоке, переслал второму, тот получил и удалил
В одном и том же менеджере, ваш Кэп.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39624714
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Ерунда. Выделил в одном потоке, переслал второму, тот получил и удалилА есть гарантия, что адресат это сообщение в результате получит, обработает и удалит то, что требуется удалить? Когда SendMessage, там понятно, а PostMessage не дожидается ответа, пуляет и уходит.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39624851
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpВ одном и том же менеджере, ваш Кэп.
Тогда да. Спасибо, Кэп!
V.BorzovА есть гарантия, что адресат это сообщение в результате получит, обработает и удалит то, что требуется удалить? Когда SendMessage, там понятно, а PostMessage не дожидается ответа, пуляет и уходит.
Не получить он может только в одном случае - если оно не отправится. А для этого достаточно вспомнить, что PostMessage это функция
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39624883
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2alekcvpВ одном и том же менеджере, ваш Кэп.
Тогда да. Спасибо, Кэп!
V.BorzovА есть гарантия, что адресат это сообщение в результате получит, обработает и удалит то, что требуется удалить? Когда SendMessage, там понятно, а PostMessage не дожидается ответа, пуляет и уходит.
Не получить он может только в одном случае - если оно не отправится. А для этого достаточно вспомнить, что PostMessage это функция
Ты не видишь разницы между фактом получения сообщения из очереди и фактом его обработки.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39624885
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Не получить он может только в одном случае - если оно не отправится.
Ложь и провокация. В любой момент цикл обработки очереди может завершиться по обычно непредсказуемым для вызывателя PostMessage причинам, не обработав при этом такие и все остальные другие сообщения.
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39624890
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2,
И что возвращает функция PostMessage?
...
Рейтинг: 0 / 0
отправить сообщение "главному потоку" из "дочернего"
    #39624893
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.BorzovВасилий 2Ерунда. Выделил в одном потоке, переслал второму, тот получил и удалилА есть гарантия, что адресат это сообщение в результате получит, обработает и удалит то, что требуется удалить? Когда SendMessage, там понятно, а PostMessage не дожидается ответа, пуляет и уходит.

Более того, при переполнении очереди сообщений - PostMessage() просто обламывается и ничего не шлет. Т.е. возможна ситуация, когда адресат просто ничего не получит.
...
Рейтинг: 0 / 0
25 сообщений из 77, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / отправить сообщение "главному потоку" из "дочернего"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]