Асинхронные компоненты в Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Асинхронные компоненты в Lazarus

Сообщение shade »

Лет 7 не пользовался ни лазарусом, ни fpc, запустил, потыкал, но кой-чего нужного мне не нашел, может кто подскажет есть ли такие компоненты и где их искать. Меня интересует асинхронная работа с сетью (в делфи были были компоненты TClientSocket, TServerSocket которые могли работать в том числе в асинхронном режиме) и асинхронная работа с (виртуальным) COM-портом. Хотелось бы чтобы GUI не блокировался в момент ожидания ответов, чтобы работу можно было построить на обработчиках событий onRead/onWrite и т.п.

Также интересуют компоненты для работы с БД, компоненты TMySQL*Connection они являются синхронными или асинхронными?
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Разве TClientSocket, TServerSocket когда то были асинхронными? Они могут быть блокирующими/не блокирующими..
А вот компоненты типа Indy сдержали в себе TThread.

TMySQL*Connection - оно функциональное: подключение к БД, запрос, вставка, изменение, удаление..

Почему бы не изучить принципы многопоточного программирования, они не сложны в изучении.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

"не блокирующими" = асинхронный
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

А.. да, немного запутался.
Действительно "не блокирующими" = асинхронный

Добавлено спустя 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
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

по поводу сети - вроде это
Ещё где то на вики видел пример работы в асинхронном режиме.

По поводу COM-портом: не интересовался. Возможно и есть.

TMySQL*Connection - да и остальное вроде не "завязано" на асинхронном режиме. Делается обёртка в потоке.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Вроде пересмотрел все вкладки компонентов в лазарусе, не нашел там TClientSocket/TServerSocket, их надо отдельно как-то ставить?
Devel0
новенький
Сообщения: 66
Зарегистрирован: 24.07.2011 10:43:13

Сообщение Devel0 »

COM-порт есть в библиотеке Synapse, но он не асинхронный. Можно сделать как в 5dpo: проверять наличие байтов для чтения в отдельном потоке - https://sourceforge.net/p/sdpo-cl/mercu ... l.pas#l438 - и либо генерировать своё событие, либо использовать TBlockSerial.OnStatus(HR_CanRead).
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

TClientSocket/TServerSocket, их надо отдельно как-то ставить?
вроде есть какой то порт. только для винды. А так в лазаре их нет. Зато, если обратить внимание на сорцы фпс, можно найти много чего полезного.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

перевод сокета из блокирующего в не блокируемый..
FpFcntl(s.Handle, F_SetFl, O_NONBLOCK);
viewtopic.php?t=9174&p=73128
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Спасибо, с юниом sockets я работал. Интересуют компоненты лазаруса чтобы они уже были включены в рабочий цикл и были готовые события чтения/записи.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Код: Выделить всё

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/
Контактная информация:

Сообщение shade »

olegy123 писал(а):function SerOpen

Спасибо.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Интересуют компоненты лазаруса...

Кто его знает: оно, или нет.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

в Indy есть, правда сервер блокирует, но клиента можно перевести в не блокируемый + закольцевать в отдельный Thread.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Я пока решил сделать свой компонент, уже даже почти работает, одна проблема - включить в цикл (но на крайний случай можно и просто на таймер повесить)

Если кто-то вспомнит что есть какой-то готовый компонент, то скажите. Про то как написать костыль не надо - это я люблю сам свои по своей ноге делать :mrgreen:
Ответить