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

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

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

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

Сообщение shade » 14.06.2017 20:33:36

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

Также интересуют компоненты для работы с БД, компоненты TMySQL*Connection они являются синхронными или асинхронными?
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

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

Сообщение olegy123 » 14.06.2017 21:49:54

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

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

Почему бы не изучить принципы многопоточного программирования, они не сложны в изучении.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение shade » 14.06.2017 21:56:01

"не блокирующими" = асинхронный
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

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

Сообщение olegy123 » 14.06.2017 22:03:53

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

Добавлено спустя 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
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение pupsik » 14.06.2017 22:25:32

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

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

TMySQL*Connection - да и остальное вроде не "завязано" на асинхронном режиме. Делается обёртка в потоке.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение shade » 15.06.2017 14:23:08

Вроде пересмотрел все вкладки компонентов в лазарусе, не нашел там TClientSocket/TServerSocket, их надо отдельно как-то ставить?
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

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

Сообщение Devel0 » 15.06.2017 17:29:46

COM-порт есть в библиотеке Synapse, но он не асинхронный. Можно сделать как в 5dpo: проверять наличие байтов для чтения в отдельном потоке - https://sourceforge.net/p/sdpo-cl/mercu ... l.pas#l438 - и либо генерировать своё событие, либо использовать TBlockSerial.OnStatus(HR_CanRead).
Devel0
новенький
 
Сообщения: 66
Зарегистрирован: 24.07.2011 10:43:13

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

Сообщение pupsik » 15.06.2017 21:23:37

TClientSocket/TServerSocket, их надо отдельно как-то ставить?
вроде есть какой то порт. только для винды. А так в лазаре их нет. Зато, если обратить внимание на сорцы фпс, можно найти много чего полезного.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение olegy123 » 15.06.2017 21:42:53

перевод сокета из блокирующего в не блокируемый..
FpFcntl(s.Handle, F_SetFl, O_NONBLOCK);
viewtopic.php?t=9174&p=73128
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение shade » 15.06.2017 21:47:58

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

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

Сообщение olegy123 » 15.06.2017 21:52:36

Код: Выделить всё
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 я работал. Интересуют компоненты лазаруса чтобы они уже были включены в рабочий цикл и были готовые события чтения/записи.

Можно же самим сделать.. я делал, правда исходники надо искать.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение shade » 15.06.2017 22:18:13

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

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

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

Сообщение pupsik » 15.06.2017 22:25:31

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

Кто его знает: оно, или нет.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение olegy123 » 15.06.2017 22:46:06

в Indy есть, правда сервер блокирует, но клиента можно перевести в не блокируемый + закольцевать в отдельный Thread.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение shade » 15.06.2017 23:14:50

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

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

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31

Рейтинг@Mail.ru