Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.01.2015, 08:33
Jury_yamal Jury_yamal вне форума
Прохожий
 
Регистрация: 04.11.2014
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как бы вы сделали обмен между потоками для СОМ порта

Добрый день Всем.
Собственно сам вопрос как лучше сделать синхронизацию/обмен между потоками одного приложения. Знаю что можно через критические секции,postmessage,send message, posttreadmessage,synchronize.
Сама задача выглядит так:
1. Есть главный поток с формой который стартует дополнительный поток приема байтов из компорта TreadRead.
2. Отсылка запроса в компорт (Write) пока делается из основного потока с формой. Пока не определился нужно ли его выносить в отдельный поток записи. Что посоветуете?. Для уточнения работа с компортом организована посредством WinAPI и структурой Overlapped т.е асинхронно.
3. Думаю сделать еще один поток (TreadWork) который будет стартовать из основного потока и разгребать полученные данные от потока компорта (TreadRead) и отсылать сформированные данные уже в основной поток с формой.
Вопрос как лучше сделать сделать обмен между TreadRead->TreadWork-> Основной поток с формой?
Как я вижу можно сделать допустим так получили данный в Tread Read отправили message в TreadWork , обработали послали message в основной поток. Причем здесь тоже может быть 2 варианта.

1. данные могут передаваться в самом сообщении (wparam b lparam).

2. просто шлем сообщение (допустим ReadOk), поток TreadWork получив такое сообщение считывает из поля TreadRead массив байтов (еще один вопрос нужно ли защищать данные через критическую секцию), обрабатывает и отсылает главному потоку.

3. Можно еще сделать на Event с WaitFor Miltiple Object.

Вот пока все что смог придумать. Может подскажите что будет работать надежней и быстрее?
С уважением к всем откликнувшимся.
Ответить с цитированием
  #2  
Старый 26.01.2015, 16:59
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Насколько долгой является обработка данных из порта? COM-порт - вещь очень медленная по современным меркам, а значит, скорее всего, обработку можно выполнять в том же потоке, который читает данные, не потеряв приходящие байты. В этом случае нет даже особой необходимости в асинхронном IO. Просто главная форма через WriteFile пишет в порт, а доп. поток в цикле вызывает ReadFile к порту и обрабатывает результаты. Действия доп потока, завязанные на главную форму, вынести в synchronize.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 06.08.2015, 11:48
Yes_Maks Yes_Maks вне форума
Прохожий
 
Регистрация: 22.07.2014
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Bargest, доброго времени! Стоит примерно аналогичная задача. Подскажи пожалуйста как правильно организовать второй поток для прослушки com порта. Суть вот в чем. Запускается основная программа и сразу же дополнительный поток, в котором происходит прослушивание ком порта. Вот код:

Код:
unit U_PortToolk;
interface
uses
  Classes, CPortCtl, ExtCtrls, CPort, U_Main;
type
  ToolkPort = class(TThread)
  ComPort: TComPort;
  private
    procedure Listn;
  protected
    procedure Execute; override;
  end;
implementation
procedure ToolkPort.Listn;
begin
  ComPort.OnRxChar:= F_Main.ComPort1RxChar;
end;
procedure ToolkPort.Execute;
begin
  repeat
    Synchronize(Listn);
  until Terminated;
end;
end.

Проблема начинается тогда, когда в основной программе я нажимаю кнопку опроса 20 устройств. В обработчике кнопки поочередно отправляется запрос 20 устройствам, они на него отвечают. По идее, после каждой итерации при приходе пакета в ком порт от устройства надо срабатывать обработчику RxChar в дополнительном потоке, НО этого не происходит. Пробуя отладчиком по шагам, получается, что пока не прогонится весь цикл от 1 до 20, событие прихода пакета в сеть не срабатывает. А после цикла все равно ничего уже не происходит, видимо буфер уже пустой. Пользуюсь установленной библиотекой ComPort Library version 4.10 от Dejan Crnila. Что делаю не так, чего не понимаю?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter