Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Duss
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
#1

Синхронизация чужого потока с моей формой - Delphi

30.07.2015, 12:01. Просмотров 522. Ответов 4
Метки нет (Все метки)

Имею DLL, в которую для организации Callback функций отправляю указатель на функцию обратного вызова.


Delphi
1
2
3
4
5
6
procedure MyCallbackFunction(code : integer); stdcall;
begin
  {...}
end;
 
  DLLObject.StartCallback(@MainPumping, 0 ,0, 0);
Если более подробно из DLL я получаю объект, у которого есть разные функции, которые можно дергать когда мне нужно, также есть функция StartCallback, которой передается указатель на функцию, которую уже дергает DLL тогда, когда она это захочет.

Проблема в том, что в DLL создается отдельный поток, который дергает мою функцию MyCallbackFunction.
Через критические секци получается синхронизировать MyCallbackFunction с моими потоками, но как синхронизировать этот поток с формой? synchronize в данном случае не получается использовать т.к. поток не мой и вызвать synchronize внутри этого потока я не могу.
Я вышел из ситуации через промежуточные переменные, в которые я записываю то, что пришло из DLL, дальше шлю Windows сообщение своей форме через sendmessage при получении которого уже из потока своей формы читаю значение промежуточных переменных и вывожу их на форму. С промежуточными переменными работаю в критических секциях конечно.
Этот способ вроде работает, но мне кажется он какой-то костыльный, может есть решение лучше?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2015, 12:01
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Синхронизация чужого потока с моей формой (Delphi):

Синхронизация потока
Имеется поток, ошибка в wsocket1.Как синхронизовать? procedure tzon.execute;...

Как из потока управлять формой, если функции потока находятся в другом классе?
Добрый вечер. Возник такой вопрос, никак не могу разобраться. Как из потока...

Доступ к форме с чужого потока
как разрешить этот доступ??

Потоки, синхронизация для работы с формой
Доброго времени суток. Собственно сабж. На форме есть text box - tbStatus в...

Управление формой из другого потока
народ, киньте пример проекта в котором форма открывается и скрывается из...

Управление формой из потока (изменение прогресса и т.д.)
У меня есть поток, выполняющий длительный процесс, но я не могу реализовать то,...

4
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
30.07.2015, 12:38 #2
TTread.Queue(...)
0
Duss
10 / 10 / 4
Регистрация: 14.01.2010
Сообщений: 80
30.07.2015, 18:08  [ТС] #3
Не совсем понятно как это может помочь, точнее как этим воспользоваться?
Если Вы имеете в виду использовать метод TTread.Queue потока, то повторюсь поток не мой, он создается в чужой DLL, доступа к исходникам которой нет. Если что-то другое, не могли бы Вы пояснить пожалуйста.
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
30.07.2015, 22:30 #4
Цитата Сообщение от Duss Посмотреть сообщение
через промежуточные переменные, в которые я записываю то, что пришло из DLL
Ну вот это, пожалуй, и можно назвать черезчур костыльным в решении с Sendmessage.

А в самом использовании SendMessage ничего костыльного нет : в VCL сплошь и рядом выполяются подобные синхронные вызовы - и ничего, до сих пор жива цветет и пахнет не дурней других)

Можно же перед вызовом SendMessage взять из кучи блок памяти, заполнить его данными, переданными из DLL и передать адрес блока одним из параметров SendMessage, а по возврату из нее вернуть блок в кучу.. Вот и не не понадобятся никакие крит.секции, если картина движения и использования данных обрисована тобой верно ..
0
northener
пофигист широкого профиля
3252 / 2304 / 628
Регистрация: 15.07.2013
Сообщений: 13,599
31.07.2015, 01:05 #5
Цитата Сообщение от Duss Посмотреть сообщение
Через критические секци получается синхронизировать MyCallbackFunction с моими потоками
А у тебя много потоков, каждый из которых использует
Цитата Сообщение от Duss Посмотреть сообщение
в DLL создается отдельный поток
?
0
31.07.2015, 01:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 01:05
Привет! Вот еще темы с решениями:

Управление формой при запуске второго потока
Главный поток запускается main'ом. Когда запускаю второй поток, мне надо, чтобы...

Закрыть форму с потока созданного этой формой
Доброго времени суток! Есть форма, есть поток со свойством IsBackground = true,...

Как правильнее реализовать паузу и остановку потока в моей программке?
Итак, писал я, писал... И под конец столкнулся с проблемой :) Есть форма, с...

Ошибка доступа при работе нового потока с формой
Доброго времени суток, дорогие форумчане! Помогите устранить проблему: при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru