Асинхронные компоненты в Lazarus
Модератор: Модераторы
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Асинхронные компоненты в Lazarus
Лет 7 не пользовался ни лазарусом, ни fpc, запустил, потыкал, но кой-чего нужного мне не нашел, может кто подскажет есть ли такие компоненты и где их искать. Меня интересует асинхронная работа с сетью (в делфи были были компоненты TClientSocket, TServerSocket которые могли работать в том числе в асинхронном режиме) и асинхронная работа с (виртуальным) COM-портом. Хотелось бы чтобы GUI не блокировался в момент ожидания ответов, чтобы работу можно было построить на обработчиках событий onRead/onWrite и т.п.
Также интересуют компоненты для работы с БД, компоненты TMySQL*Connection они являются синхронными или асинхронными?
Также интересуют компоненты для работы с БД, компоненты TMySQL*Connection они являются синхронными или асинхронными?
Разве TClientSocket, TServerSocket когда то были асинхронными? Они могут быть блокирующими/не блокирующими..
А вот компоненты типа Indy сдержали в себе TThread.
TMySQL*Connection - оно функциональное: подключение к БД, запрос, вставка, изменение, удаление..
Почему бы не изучить принципы многопоточного программирования, они не сложны в изучении.
А вот компоненты типа Indy сдержали в себе TThread.
TMySQL*Connection - оно функциональное: подключение к БД, запрос, вставка, изменение, удаление..
Почему бы не изучить принципы многопоточного программирования, они не сложны в изучении.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
"не блокирующими" = асинхронный
А.. да, немного запутался.
Действительно "не блокирующими" = асинхронный
Добавлено спустя 1 минуту 56 секунд:
Все также сокет переводите в режим "без блокировок" - получаете асинхронный порт.
Добавлено спустя 18 минут 16 секунд:
вспомнил.. как я делал.
Обычно dll-ка не thread изолированна. При многопоточной работе можно выловить ексепшен.
решается так:
Инициализацией mysql_library_init()
и каждый трейд обязан быть инициализирован mysql_thread_init()
https://dev.mysql.com/doc/refman/5.7/en ... ients.html
Действительно "не блокирующими" = асинхронный
Добавлено спустя 1 минуту 56 секунд:
Все также сокет переводите в режим "без блокировок" - получаете асинхронный порт.
Добавлено спустя 18 минут 16 секунд:
shade писал(а):TMySQL*Connection
вспомнил.. как я делал.
Обычно dll-ка не thread изолированна. При многопоточной работе можно выловить ексепшен.
решается так:
Инициализацией mysql_library_init()
и каждый трейд обязан быть инициализирован mysql_thread_init()
https://dev.mysql.com/doc/refman/5.7/en ... ients.html
по поводу сети - вроде это
Ещё где то на вики видел пример работы в асинхронном режиме.
По поводу COM-портом: не интересовался. Возможно и есть.
TMySQL*Connection - да и остальное вроде не "завязано" на асинхронном режиме. Делается обёртка в потоке.
Ещё где то на вики видел пример работы в асинхронном режиме.
По поводу COM-портом: не интересовался. Возможно и есть.
TMySQL*Connection - да и остальное вроде не "завязано" на асинхронном режиме. Делается обёртка в потоке.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Вроде пересмотрел все вкладки компонентов в лазарусе, не нашел там TClientSocket/TServerSocket, их надо отдельно как-то ставить?
COM-порт есть в библиотеке Synapse, но он не асинхронный. Можно сделать как в 5dpo: проверять наличие байтов для чтения в отдельном потоке - https://sourceforge.net/p/sdpo-cl/mercu ... l.pas#l438 - и либо генерировать своё событие, либо использовать TBlockSerial.OnStatus(HR_CanRead).
вроде есть какой то порт. только для винды. А так в лазаре их нет. Зато, если обратить внимание на сорцы фпс, можно найти много чего полезного.TClientSocket/TServerSocket, их надо отдельно как-то ставить?
перевод сокета из блокирующего в не блокируемый..
FpFcntl(s.Handle, F_SetFl, O_NONBLOCK);
viewtopic.php?t=9174&p=73128
FpFcntl(s.Handle, F_SetFl, O_NONBLOCK);
viewtopic.php?t=9174&p=73128
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Спасибо, с юниом sockets я работал. Интересуют компоненты лазаруса чтобы они уже были включены в рабочий цикл и были готовые события чтения/записи.
Код: Выделить всё
function SerOpen(const DeviceName: String): TSerialHandle;
var
flags : cint;
begin
Result := fpopen(DeviceName, O_RDWR or O_NOCTTY or O_NONBLOCK);
if result > -1 then
begin
flags := fpfcntl(Result,F_GetFl);
fpfcntl(Result,F_SETFL,flags and (not O_NONBLOCK));
end;
end;
Добавлено спустя 11 минут 10 секунд:
shade писал(а):Спасибо, с юниом sockets я работал. Интересуют компоненты лазаруса чтобы они уже были включены в рабочий цикл и были готовые события чтения/записи.
Можно же самим сделать.. я делал, правда исходники надо искать.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
olegy123 писал(а):function SerOpen
Спасибо.
в Indy есть, правда сервер блокирует, но клиента можно перевести в не блокируемый + закольцевать в отдельный Thread.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Я пока решил сделать свой компонент, уже даже почти работает, одна проблема - включить в цикл (но на крайний случай можно и просто на таймер повесить)
Если кто-то вспомнит что есть какой-то готовый компонент, то скажите. Про то как написать костыль не надо - это я люблю сам свои по своей ноге делать
Если кто-то вспомнит что есть какой-то готовый компонент, то скажите. Про то как написать костыль не надо - это я люблю сам свои по своей ноге делать
