unit RDThread; interface uses Classes, D2xxUnit, user_types, windows; type TRDThread = class(TThread) private procedure Get_device_message;{ Private declarations } procedure Wait_for_byte; procedure Message_got; protected procedure Execute; override; public message_: message_Array; constructor Create (suspended:boolean); virtual; destructor Destroy; override; end; var message_begin: Boolean; implementation uses MainUnit; { TRDThread } constructor TRDThread.Create(suspended:boolean); begin inherited Create ( suspended ); self.Priority := tpLower; self.FreeOnTerminate:=true; end; destructor TRDThread.Destroy; begin self.Suspend; inherited; end; procedure TRDThread.Execute; begin Get_device_message;{ Place thread code here } end; procedure TRDThread.Wait_for_byte; begin repeat if not self.Terminated then begin Get_USB_Device_Status; sleep(DEVICE_READING_SLEEP_VALUE); end else exit; //проверяем буфер устройства //в этом месте идет загрузка на 100%. Вопрос в том как справится!!! until FT_Q_Bytes > DEVICE_MESSAGE_LENGTH_FOR_READING; exit; end; procedure TRDThread.Message_got; begin message_begin := FALSE; Synchronize(MainForm.device.Got_last_message_byte); end; procedure TRDThread.Get_device_message; var first_byte: Integer; last_byte: Integer; m: Integer; begin //инициализация массива для хранения посылки for m := 0 to length( message_ ) - 1 do message_[ m ] := 0; while not self.Terminated do begin Wait_for_byte; if self.Terminated then exit; Synchronize(MainForm.device.Got_first_message_byte); Read_USB_Device_Buffer( DEVICE_BYTES_TO_READ ); //читаем буфер устройства first_byte := FT_In_Buffer[ DEVICE_FIRST_MESSAGE_BYTE_NUMBER ]; //читаем первое число last_byte := FT_In_Buffer[ DEVICE_LAST_MESSAGE_BYTE_NUMBER ]; //читаем последнее число if ( first_byte = DEVICE_FIRST_MESSAGE_BYTE_VALUE ) and ( last_byte = DEVICE_LAST_MESSAGE_BYTE_VALUE ) then //$F0 начало посылки for m := 0 to length( message_ ) - 1 do begin message_[ m ] := FT_In_Buffer[ m ]; end; Message_got; end; end; end.