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

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

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

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

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

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

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

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


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

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


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