Таймер в отдельном потоке.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Таймер в отдельном потоке.

Сообщение artkil » 18.11.2011 14:17:20

Здравствуйте.
Есть поток, в процедуре Execute потока опрашивается устройство по TCP(на winsock реализовано, без всяких оберток), естественно если соединение не разорвано и устройство не посылает данные, то процедура может надолго зависнуть. И нужно чтобы через определенный интервал времени выполнялась одна процедура, которая будет проверять как давно последний раз приходили данные. До этого писал на Delphi, но понадобилась кроссплатформенность, и выбор пал на freepascal/lazarus. Как организовать работу таймера в отдельном потоке (т.е. в одном и том же потоке должно опрашиваться устройство и работать таймер)?

Может как-то сделать обработку системных сообщений? Наподобии:
Код: Выделить всё
while GetMessage(Msg, 0, 0, 0) do
begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
end;


Есть какое-нибудь кросплатформенное решение этого в freepascal?
artkil
незнакомец
 
Сообщения: 9
Зарегистрирован: 18.11.2011 14:07:29

Re: Таймер в отдельном потоке.

Сообщение B4rr4cuda » 19.11.2011 00:17:44

Имхо, проще всего запустить еще один поток. И, чтоб не извращаться, заюзать процедуру ( с циклом проверки и слипом) запущенную в потоке с помощью функции BeginThread.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Таймер в отдельном потоке.

Сообщение dr.miller » 19.11.2011 10:14:48

А что есл в той самой процедуре, в момент получения данных запоминать текущее время, а в когда процедура ждет данные и не получает результата - замерять интервал между текущим (now) и тем что было заполнено ранее. При вырастании интервала до заданного критического размера - сделать бесконечное выполнение - невозможным. Величину интервала было бы неплохо сделать настраиваемым а не константным. ИМХО
Аватара пользователя
dr.miller
незнакомец
 
Сообщения: 7
Зарегистрирован: 17.11.2011 12:47:34
Откуда: Краснодар

Re: Таймер в отдельном потоке.

Сообщение artkil » 21.11.2011 07:25:57

Про запоминание это понятное дело, а вот если соединение существует, но данных нет поток подвиснет на процедуре recv. Про второй поток, который будет следить за остальными тоже думал.

Добавлено спустя 45 минут 18 секунд:
Проблема решилась.
Сделал так:
Код: Выделить всё
while not Terminated do
begin
  if (Now - FLastCheck) > (1 / 24 / 60) then
   ResetConnection;
  select(0, @s_read, nil, nil, @tv);
  if s_read.fd_count = 0 then
   continue;
  ret = recv(FSocket, buf, len, 0);
  FLastCheck := Now;
  Check(buf);
end;
artkil
незнакомец
 
Сообщения: 9
Зарегистрирован: 18.11.2011 14:07:29


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru