Выдрал из свего старого проекта.
уже много лет на дельфи не писал. Вам надо реализовать примерно следующее
Код
type TFtdi=class(TObject)
protected
hCom:THandle;
hThr:THandle;
hEvt:THandle;
Terminate:boolean;
procedure WorkThread;
public
hWin:THandle;
constructor Create;
destructor Destroy; override;
function Open(const Port:string):integer;
function Close:integer;
........
end;
constructor TFtdi.Create;
begin
inherited;
end;
destructor TFtdi.Destroy;
begin
if hFtdi<>0 then Close;
inherited;
end;
function Starter(Param:pointer):cardinal;
begin
TFtdi(Param).WorkThread;
result:=0;
ExitThread(0);
end;
function TFtdi.Open(const Port: string): integer;
var Temp:cardinal;
begin
if hFtdi<>0 then Close;
hFtdi:= // здесь надо открыть ftdi
if hFtdi=INVALID_HANDLE_VALUE then
begin
hFtdi:=0;
Result:=GetLastError;
exit;
end;
hEvt:=CreateEvent(nil,true,false,nil);
//вызываете FT_SetEventNotification с нужными параметрами
FT_SetEventNotification(......);
Terminate:=false;
hThr:=BeginThread(nil,0,@Starter,Self,0,Temp);
Result:=0;
end;
function TFtdi.Close: integer;
var Num:Cardinal;
begin
if hThr<>0 then
begin
Terminate:=true;
SetEvent(hEvt);
if WaitForSingleObject(hThr,50)<>WAIT_OBJECT_0 then
begin
TerminateThread(hThr,0);
WaitForSingleObject(hThr,20);
end;
hThr:=0;
end;
if hFtdi<>0 then
begin
// здесь надо закрыть FTDI
end;
hFtdi:=0;
Result:=GetLastError;
end;
procedure TFtdi.WorkThread;
begin
repeat
WaitForSingleObject(hEvt,INFINITE);
ResetEvent(hEvt);
if Terminate then
begin
........ // требуется завершение нити
exit;
end;
PostMessage(hWin,WM_PACKET,....,...)
until false;
end;