Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
Duss
10 / 10 / 0
Регистрация: 14.01.2010
Сообщений: 80
#1

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

30.07.2015, 12:01. Просмотров 488. Ответов 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):

Синхронизация потока - Delphi
Имеется поток, ошибка в wsocket1.Как синхронизовать? procedure tzon.execute; var t:integer; begin WSocket1.Sendline('JOIN...

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

Доступ к форме с чужого потока - C++/CLI WinForms
как разрешить этот доступ??

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

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

.NET 3.x Управление формой из потока (изменение прогресса и т.д.) - C#
У меня есть поток, выполняющий длительный процесс, но я не могу реализовать то, чтобы он сообщал о своих успехах форме, в частности крутил...

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

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

Можно же перед вызовом SendMessage взять из кучи блок памяти, заполнить его данными, переданными из DLL и передать адрес блока одним из параметров SendMessage, а по возврату из нее вернуть блок в кучу.. Вот и не не понадобятся никакие крит.секции, если картина движения и использования данных обрисована тобой верно ..
0
northener
пофигист широкого профиля
3205 / 2258 / 484
Регистрация: 15.07.2013
Сообщений: 13,204
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
Привет! Вот еще темы с ответами:

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

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

Синхронизация потока с рекурсивной функцией - Java SE
Пытаюсь осваивать многотопоточность. Делаю задачу, которую сам придумал :) Итак, есть два класса. Один класс implements Runnable,...

Как пользоваться событиями или как управлять формой из потока? - C++/CLI WinForms
Начнем справа налево: Предположим есть поток tr1 и глобальная переменная int i; void tr1(){ while(openMain){ i++; } ...


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

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

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